blob: 56ee85d13eaa35cf1d4a6badf216ca86de313d7c [file] [log] [blame]
sewardjde4a1d02002-03-22 01:27:54 +00001
2/*--------------------------------------------------------------------*/
3/*--- A header file for all parts of Valgrind. ---*/
4/*--- Include no other! ---*/
5/*--- vg_include.h ---*/
6/*--------------------------------------------------------------------*/
7
8/*
9 This file is part of Valgrind, an x86 protected-mode emulator
10 designed for debugging and profiling binaries on x86-Unixes.
11
12 Copyright (C) 2000-2002 Julian Seward
13 jseward@acm.org
14 Julian_Seward@muraroa.demon.co.uk
15
16 This program is free software; you can redistribute it and/or
17 modify it under the terms of the GNU General Public License as
18 published by the Free Software Foundation; either version 2 of the
19 License, or (at your option) any later version.
20
21 This program is distributed in the hope that it will be useful, but
22 WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 General Public License for more details.
25
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
29 02111-1307, USA.
30
31 The GNU General Public License is contained in the file LICENSE.
32*/
33
34#ifndef __VG_INCLUDE_H
35#define __VG_INCLUDE_H
36
37
38#include <stdarg.h> /* ANSI varargs stuff */
39#include <setjmp.h> /* for jmp_buf */
40
41
42/* ---------------------------------------------------------------------
43 Build options and table sizes. You should be able to change these
44 options or sizes, recompile, and still have a working system.
45 ------------------------------------------------------------------ */
46
47#include "vg_constants.h"
48
49
50/* Set to 1 to enable time profiling. Since this uses SIGPROF, we
51 don't want this permanently enabled -- only for profiling
52 builds. */
53#if 0
54# define VG_PROFILE
55#endif
56
57
58/* Total number of integer registers available for allocation. That's
59 all of them except %esp, %edi and %ebp. %edi is a general spare
60 temporary. %ebp permanently points at VG_(baseBlock). Note that
61 it's important that this tie in with what rankToRealRegNo() says.
62 DO NOT CHANGE THIS VALUE FROM 5. ! */
63#define VG_MAX_REALREGS 5
64
65/* Total number of spill slots available for allocation, if a TempReg
66 doesn't make it into a RealReg. Just bomb the entire system if
67 this value is too small; we don't expect it will ever get
68 particularly high. */
69#define VG_MAX_SPILLSLOTS 24
70
71
72/* Constants for the slow translation lookup cache. */
73#define VG_TRANSTAB_SLOW_BITS 11
74#define VG_TRANSTAB_SLOW_SIZE (1 << VG_TRANSTAB_SLOW_BITS)
75#define VG_TRANSTAB_SLOW_MASK ((VG_TRANSTAB_SLOW_SIZE) - 1)
76
77/* Size of a buffer used for creating messages. */
78#define M_VG_MSGBUF 10000
79
80/* Size of a smallish table used to read /proc/self/map entries. */
81#define M_PROCMAP_BUF 20000
82
83/* Max length of pathname to a .so/executable file. */
84#define M_VG_LIBNAMESTR 100
85
86/* Max length of a text fragment used to construct error messages. */
87#define M_VG_ERRTXT 512
88
89/* Max length of the string copied from env var VG_ARGS at startup. */
90#define M_VG_CMDLINE_STRLEN 1000
91
92/* Max number of options for Valgrind which we can handle. */
93#define M_VG_CMDLINE_OPTS 100
94
95/* After this many different unsuppressed errors have been observed,
96 be more conservative about collecting new ones. */
97#define M_VG_COLLECT_ERRORS_SLOWLY_AFTER 50
98
99/* After this many different unsuppressed errors have been observed,
100 stop collecting errors at all, and tell the user their program is
101 evidently a steaming pile of camel dung. */
102#define M_VG_COLLECT_NO_ERRORS_AFTER 500
103
104/* These many bytes below %ESP are considered addressible if we're
105 doing the --workaround-gcc296-bugs hack. */
106#define VG_GCC296_BUG_STACK_SLOP 256
107
108/* The maximum number of calls we're prepared to save in a
109 backtrace. */
110#define VG_DEEPEST_BACKTRACE 50
111
112/* Number of lists in which we keep track of malloc'd but not free'd
113 blocks. Should be prime. */
114#define VG_N_MALLOCLISTS 997
115
116/* Number of lists in which we keep track of ExeContexts. Should be
117 prime. */
118#define VG_N_EC_LISTS /*997*/ 4999
119
sewardj2e93c502002-04-12 11:12:52 +0000120/* Defines the thread-scheduling timeslice, in terms of the number of
121 basic blocks we attempt to run each thread for. Smaller values
122 give finer interleaving but much increased scheduling overheads. */
123#define VG_SCHEDULING_QUANTUM 10000
124
125/* The maximum number of pthreads that we support. This is
126 deliberately not very high since our implementation of some of the
127 scheduler algorithms is surely O(N^2) in the number of threads,
128 since that's simple, at least. And (in practice) we hope that most
129 programs do not need many threads. */
130#define VG_N_THREADS 20
131
132/* Number of file descriptors that can simultaneously be waited on for
133 I/O to complete. Perhaps this should be the same as VG_N_THREADS
134 (surely a thread can't wait on more than one fd at once?. Who
135 knows.) */
136#define VG_N_WAITING_FDS 10
137
138/* Maximum number of mutexes allowed. */
139#define VG_N_MUTEXES 10
140
sewardjde4a1d02002-03-22 01:27:54 +0000141
142/* ---------------------------------------------------------------------
143 Basic types
144 ------------------------------------------------------------------ */
145
146typedef unsigned char UChar;
147typedef unsigned short UShort;
148typedef unsigned int UInt;
149typedef unsigned long long int ULong;
150
151typedef signed char Char;
152typedef signed short Short;
153typedef signed int Int;
154typedef signed long long int Long;
155
156typedef unsigned int Addr;
157
158typedef unsigned char Bool;
159#define False ((Bool)0)
160#define True ((Bool)1)
161
162#define mycat_wrk(aaa,bbb) aaa##bbb
163#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
164
165/* Just pray that gcc's constant folding works properly ... */
166#define BITS(bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0) \
167 ( ((bit7) << 7) | ((bit6) << 6) | ((bit5) << 5) | ((bit4) << 4) \
168 | ((bit3) << 3) | ((bit2) << 2) | ((bit1) << 1) | (bit0))
169
170
171/* ---------------------------------------------------------------------
172 Now the basic types are set up, we can haul in the kernel-interface
173 definitions.
174 ------------------------------------------------------------------ */
175
176#include "./vg_kerneliface.h"
177
178
179/* ---------------------------------------------------------------------
180 Command-line-settable options
181 ------------------------------------------------------------------ */
182
183#define VG_CLO_SMC_NONE 0
184#define VG_CLO_SMC_SOME 1
185#define VG_CLO_SMC_ALL 2
186
187#define VG_CLO_MAX_SFILES 10
188
sewardj97ced732002-03-25 00:07:36 +0000189/* Shall we V-check addrs (they are always A checked too): default: YES */
190extern Bool VG_(clo_check_addrVs);
sewardjde4a1d02002-03-22 01:27:54 +0000191/* Enquire about whether to attach to GDB at errors? default: NO */
192extern Bool VG_(clo_GDB_attach);
193/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
194extern Int VG_(sanity_level);
195/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
196extern Int VG_(clo_verbosity);
197/* Automatically attempt to demangle C++ names? default: YES */
198extern Bool VG_(clo_demangle);
199/* Do leak check at exit? default: NO */
200extern Bool VG_(clo_leak_check);
201/* In leak check, show reachable-but-not-freed blocks? default: NO */
202extern Bool VG_(clo_show_reachable);
203/* How closely should we compare ExeContexts in leak records? default: 2 */
204extern Int VG_(clo_leak_resolution);
205/* Round malloc sizes upwards to integral number of words? default:
206 NO */
207extern Bool VG_(clo_sloppy_malloc);
208/* Allow loads from partially-valid addresses? default: YES */
209extern Bool VG_(clo_partial_loads_ok);
210/* Simulate child processes? default: NO */
211extern Bool VG_(clo_trace_children);
212/* The file id on which we send all messages. default: 2 (stderr). */
213extern Int VG_(clo_logfile_fd);
214/* Max volume of the freed blocks queue. */
215extern Int VG_(clo_freelist_vol);
216/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
217 default: NO */
218extern Bool VG_(clo_workaround_gcc296_bugs);
219
220/* The number of suppression files specified. */
221extern Int VG_(clo_n_suppressions);
222/* The names of the suppression files. */
223extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
224
225/* Single stepping? default: NO */
226extern Bool VG_(clo_single_step);
227/* Code improvement? default: YES */
228extern Bool VG_(clo_optimise);
229/* Memory-check instrumentation? default: YES */
230extern Bool VG_(clo_instrument);
231/* DEBUG: clean up instrumented code? default: YES */
232extern Bool VG_(clo_cleanup);
233/* Handle client memory-range-permissions-setting requests? default: NO */
234extern Bool VG_(clo_client_perms);
235/* SMC write checks? default: SOME (1,2,4 byte movs to mem) */
236extern Int VG_(clo_smc_check);
237/* DEBUG: print system calls? default: NO */
238extern Bool VG_(clo_trace_syscalls);
239/* DEBUG: print signal details? default: NO */
240extern Bool VG_(clo_trace_signals);
241/* DEBUG: print symtab details? default: NO */
242extern Bool VG_(clo_trace_symtab);
243/* DEBUG: print malloc details? default: NO */
244extern Bool VG_(clo_trace_malloc);
sewardj8937c812002-04-12 20:12:20 +0000245/* DEBUG: print thread scheduling events? default: NO */
246extern Bool VG_(clo_trace_sched);
247/* DEBUG: print pthread (mutex etc) events? default: NO */
248extern Bool VG_(clo_trace_pthread);
sewardjde4a1d02002-03-22 01:27:54 +0000249/* Stop after this many basic blocks. default: Infinity. */
250extern ULong VG_(clo_stop_after);
251/* Display gory details for the k'th most popular error. default:
252 Infinity. */
253extern Int VG_(clo_dump_error);
254/* Number of parents of a backtrace. Default: 8. */
255extern Int VG_(clo_backtrace_size);
256
257
258/* ---------------------------------------------------------------------
259 Debugging and profiling stuff
260 ------------------------------------------------------------------ */
261
262/* No, really. I _am_ that strange. */
263#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
264
265/* Tools for building messages from multiple parts. */
266typedef
267 enum { Vg_UserMsg, Vg_DebugMsg, Vg_DebugExtraMsg }
268 VgMsgKind;
269
270extern void VG_(start_msg) ( VgMsgKind kind );
271extern void VG_(add_to_msg) ( Char* format, ... );
272extern void VG_(end_msg) ( void );
273
274/* Send a simple, single-part message. */
275extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
276
277/* Create a logfile into which messages can be dumped. */
278extern void VG_(startup_logging) ( void );
279extern void VG_(shutdown_logging) ( void );
280
281
282/* Profiling stuff */
283#ifdef VG_PROFILE
284
285#define VGP_M_STACK 10
286
287#define VGP_M_CCS 20 /* == the # of elems in VGP_LIST */
288#define VGP_LIST \
289 VGP_PAIR(VgpRun=0, "running"), \
290 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
291 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
292 VGP_PAIR(VgpTranslate, "translate-main"), \
293 VGP_PAIR(VgpToUCode, "to-ucode"), \
294 VGP_PAIR(VgpFromUcode, "from-ucode"), \
295 VGP_PAIR(VgpImprove, "improve"), \
296 VGP_PAIR(VgpInstrument, "instrument"), \
297 VGP_PAIR(VgpCleanup, "cleanup"), \
298 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
299 VGP_PAIR(VgpDoLRU, "do-lru"), \
300 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
301 VGP_PAIR(VgpInitAudit, "init-mem-audit"), \
302 VGP_PAIR(VgpExeContext, "exe-context"), \
303 VGP_PAIR(VgpReadSyms, "read-syms"), \
304 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
305 VGP_PAIR(VgpSARP, "set-addr-range-perms"), \
306 VGP_PAIR(VgpSyscall, "syscall wrapper"), \
307 VGP_PAIR(VgpSpare1, "spare 1"), \
308 VGP_PAIR(VgpSpare2, "spare 2")
309
310#define VGP_PAIR(enumname,str) enumname
311typedef enum { VGP_LIST } VgpCC;
312#undef VGP_PAIR
313
314extern void VGP_(init_profiling) ( void );
315extern void VGP_(done_profiling) ( void );
316extern void VGP_(pushcc) ( VgpCC );
317extern void VGP_(popcc) ( void );
318
319#define VGP_PUSHCC(cc) VGP_(pushcc)(cc)
320#define VGP_POPCC VGP_(popcc)()
321
322#else
323
324#define VGP_PUSHCC(cc) /* */
325#define VGP_POPCC /* */
326
327#endif /* VG_PROFILE */
328
329
330/* ---------------------------------------------------------------------
331 Exports of vg_malloc2.c
332 ------------------------------------------------------------------ */
333
334/* Allocation arenas.
335 SYMTAB is for Valgrind's symbol table storage.
336 CLIENT is for the client's mallocs/frees.
337 DEMANGLE is for the C++ demangler.
338 EXECTXT is for storing ExeContexts.
339 ERRCTXT is for storing ErrContexts.
340 PRIVATE is for Valgrind general stuff.
341 TRANSIENT is for very short-term use. It should be empty
342 in between uses.
343 When adding a new arena, remember also to add it
344 to ensure_mm_init().
345*/
346typedef Int ArenaId;
347
348#define VG_N_ARENAS 7
349
350#define VG_AR_PRIVATE 0 /* :: ArenaId */
351#define VG_AR_SYMTAB 1 /* :: ArenaId */
352#define VG_AR_CLIENT 2 /* :: ArenaId */
353#define VG_AR_DEMANGLE 3 /* :: ArenaId */
354#define VG_AR_EXECTXT 4 /* :: ArenaId */
355#define VG_AR_ERRCTXT 5 /* :: ArenaId */
356#define VG_AR_TRANSIENT 6 /* :: ArenaId */
357
358extern void* VG_(malloc) ( ArenaId arena, Int nbytes );
359extern void VG_(free) ( ArenaId arena, void* ptr );
360extern void* VG_(calloc) ( ArenaId arena, Int nmemb, Int nbytes );
361extern void* VG_(realloc) ( ArenaId arena, void* ptr, Int size );
362extern void* VG_(malloc_aligned) ( ArenaId aid, Int req_alignB,
363 Int req_pszB );
364
365extern void VG_(mallocSanityCheckArena) ( ArenaId arena );
366extern void VG_(mallocSanityCheckAll) ( void );
367
368extern void VG_(show_all_arena_stats) ( void );
369extern Bool VG_(is_empty_arena) ( ArenaId aid );
370
371
372/* The red-zone size for the client. This can be arbitrary, but
373 unfortunately must be set at compile time. */
374#define VG_AR_CLIENT_REDZONE_SZW 4
375
376#define VG_AR_CLIENT_REDZONE_SZB \
377 (VG_AR_CLIENT_REDZONE_SZW * VKI_BYTES_PER_WORD)
378
379
380/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000381 Exports of vg_clientfuns.c
382 ------------------------------------------------------------------ */
383
384/* This doesn't export code or data that valgrind.so needs to link
385 against. However, the scheduler does need to know the following
386 request codes. A few, publically-visible, request codes are also
387 defined in valgrind.h. */
388
389#define VG_USERREQ__MALLOC 0x2001
390#define VG_USERREQ__BUILTIN_NEW 0x2002
391#define VG_USERREQ__BUILTIN_VEC_NEW 0x2003
392
393#define VG_USERREQ__FREE 0x2004
394#define VG_USERREQ__BUILTIN_DELETE 0x2005
395#define VG_USERREQ__BUILTIN_VEC_DELETE 0x2006
396
397#define VG_USERREQ__CALLOC 0x2007
398#define VG_USERREQ__REALLOC 0x2008
399#define VG_USERREQ__MEMALIGN 0x2009
400
401
402#define VG_USERREQ__PTHREAD_CREATE 0x3001
403#define VG_USERREQ__PTHREAD_CREATE_BOGUSRA 0x3002
404#define VG_USERREQ__PTHREAD_JOIN 0x3003
405#define VG_USERREQ__PTHREAD_GET_THREADID 0x3004
406#define VG_USERREQ__PTHREAD_MUTEX_INIT 0x3005
407#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x3006
408#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x3007
409#define VG_USERREQ__PTHREAD_MUTEX_DESTROY 0x3008
410#define VG_USERREQ__PTHREAD_CANCEL 0x3009
411
412/* ---------------------------------------------------------------------
413 Constants pertaining to the simulated CPU state, VG_(baseBlock),
414 which need to go here to avoid ugly circularities.
415 ------------------------------------------------------------------ */
416
417/* How big is the saved FPU state? */
418#define VG_SIZE_OF_FPUSTATE 108
419/* ... and in words ... */
420#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
421
422
423/* ---------------------------------------------------------------------
424 Exports of vg_scheduler.c
425 ------------------------------------------------------------------ */
426
427/* ThreadIds are simply indices into the vg_threads[] array. */
428typedef
429 UInt
430 ThreadId;
431
432/* MutexIds are simply indices into the vg_mutexes[] array. */
433typedef
434 UInt
435 MutexId;
436
437
438#define VG_INVALID_THREADID ((ThreadId)(-1))
439
440typedef
441 enum {
442 VgTs_Empty, /* this slot is not in use */
443 VgTs_Runnable, /* waiting to be scheduled */
444 VgTs_WaitJoiner, /* waiting for someone to do join on me */
445 VgTs_WaitJoinee, /* waiting for the thread I did join on */
446 VgTs_WaitFD, /* waiting for I/O completion on a fd */
447 VgTs_WaitMX, /* waiting on a mutex */
448 VgTs_Sleeping /* sleeping for a while */
449 }
450 ThreadStatus;
451
452typedef
453 struct {
454 /* The thread identity is simply the index in vg_threads[].
455 ThreadId == 0 is the root thread and has the special property
456 that we don't try and allocate or deallocate its stack. */
457
458 /* Current scheduling status. */
459 ThreadStatus status;
460
461 /* Identity of joiner (thread who called join on me), or
462 VG_INVALID_THREADID if no one asked to join yet. */
463 ThreadId joiner;
464
465 /* Identity of mutex we are waiting on, if .status == WaitMX. */
466 MutexId waited_on_mid;
467
468 /* If VgTs_Sleeping, this is when we should wake up. */
469 ULong awaken_at;
470
471 /* return value */
472 void* retval;
473
474 /* Stacks. When a thread slot is freed, we don't deallocate its
475 stack; we just leave it lying around for the next use of the
476 slot. If the next use of the slot requires a larger stack,
477 only then is the old one deallocated and a new one
478 allocated.
479
480 For the main thread (threadid == 0), this mechanism doesn't
481 apply. We don't know the size of the stack since we didn't
482 allocate it, and furthermore we never reallocate it. */
483
484 /* The allocated size of this thread's stack (permanently zero
485 if this is ThreadId == 0, since we didn't allocate its stack) */
486 UInt stack_size;
487
488 /* Address of the lowest word in this thread's stack. NULL means
489 not allocated yet.
490 */
491 Addr stack_base;
492
493 /* Saved machine context. */
494 UInt m_eax;
495 UInt m_ebx;
496 UInt m_ecx;
497 UInt m_edx;
498 UInt m_esi;
499 UInt m_edi;
500 UInt m_ebp;
501 UInt m_esp;
502 UInt m_eflags;
503 UInt m_eip;
504 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
505
506 UInt sh_eax;
507 UInt sh_ebx;
508 UInt sh_ecx;
509 UInt sh_edx;
510 UInt sh_esi;
511 UInt sh_edi;
512 UInt sh_ebp;
513 UInt sh_esp;
514 UInt sh_eflags;
515 }
516 ThreadState;
517
518
519/* Copy the specified thread's state into VG_(baseBlock) in
520 preparation for running it. */
521extern void VG_(load_thread_state)( ThreadId );
522
523/* Save the specified thread's state back in VG_(baseBlock), and fill
524 VG_(baseBlock) with junk, for sanity-check reasons. */
525extern void VG_(save_thread_state)( ThreadId );
526
527/* Get the thread state block for the specified thread. */
528extern ThreadState* VG_(get_thread_state)( ThreadId );
529
530
531/* Create, and add to TT/TC, the translation of a client basic
532 block. */
533extern void VG_(create_translation_for) ( Addr orig_addr );
534
535/* Return codes from the scheduler. */
536typedef
537 enum { VgSrc_Deadlock, VgSrc_Shutdown, VgSrc_BbsDone }
538 VgSchedReturnCode;
539
540/* The scheduler. */
541extern VgSchedReturnCode VG_(scheduler) ( void );
542
543extern void VG_(scheduler_init) ( void );
544
545
546/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
547extern jmp_buf VG_(scheduler_jmpbuf);
548/* ... and if so, here's the signal which caused it to do so. */
549extern Int VG_(longjmpd_on_signal);
550
551
552/* We check that the initial stack, which we can't move, is allocated
553 here. VG_(scheduler_init) checks this.
554*/
555#define VG_STARTUP_STACK_MASK (Addr)0xBFFF8000
556
557
558/* The red-zone size which we put at the bottom (highest address) of
559 thread stacks, for paranoia reasons. This can be arbitrary, and
560 doesn't really need to be set at compile time. */
561#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
562
563#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
564 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
565
566
567
568/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000569 Exports of vg_signals.c
570 ------------------------------------------------------------------ */
571
sewardjde4a1d02002-03-22 01:27:54 +0000572extern void VG_(sigstartup_actions) ( void );
573
sewardj2e93c502002-04-12 11:12:52 +0000574extern void VG_(deliver_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000575extern void VG_(unblock_host_signal) ( Int sigNo );
576
577
578/* Fake system calls for signal handling. */
sewardj2e93c502002-04-12 11:12:52 +0000579extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000580extern void VG_(do__NR_sigprocmask) ( Int how, vki_ksigset_t* set );
581
sewardj2e93c502002-04-12 11:12:52 +0000582/* Bogus return address for signal handlers. Is never executed. */
583extern void VG_(signalreturn_bogusRA) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000584
sewardj2e93c502002-04-12 11:12:52 +0000585/* Modify the current thread's state once we have detected it is
586 returning from a signal handler. */
587extern void VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000588
sewardj2e93c502002-04-12 11:12:52 +0000589/* Handy utilities to block/restore all host signals. */
590extern void VG_(block_all_host_signals)
591 ( /* OUT */ vki_ksigset_t* saved_mask );
592extern void VG_(restore_host_signals)
593 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000594
595/* ---------------------------------------------------------------------
596 Exports of vg_mylibc.c
597 ------------------------------------------------------------------ */
598
599
600#define NULL ((void*)0)
601
602extern void VG_(exit)( Int status )
603 __attribute__ ((__noreturn__));
604
605extern void VG_(printf) ( const char *format, ... );
606/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
607
608extern void VG_(sprintf) ( Char* buf, Char *format, ... );
609
610extern void VG_(vprintf) ( void(*send)(Char),
611 const Char *format, va_list vargs );
612
613extern Bool VG_(isspace) ( Char c );
614
615extern Int VG_(strlen) ( const Char* str );
616
617extern Long VG_(atoll) ( Char* str );
618
619extern Char* VG_(strcat) ( Char* dest, const Char* src );
620extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
621extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
622
623extern Char* VG_(strcpy) ( Char* dest, const Char* src );
624
625extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
626extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
627
628extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
629extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
630
631extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
632extern Char* VG_(strchr) ( const Char* s, Char c );
633extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
634
635extern Char* VG_(getenv) ( Char* name );
636extern Int VG_(getpid) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000637extern ULong VG_(read_microsecond_timer)( void );
sewardjde4a1d02002-03-22 01:27:54 +0000638
639
640extern Char VG_(toupper) ( Char c );
641
642extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
643
644extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
645
646extern Bool VG_(stringMatch) ( Char* pat, Char* str );
647
648
649#define __STRING(x) #x
650
651/* Asserts are permanently enabled. Hurrah! */
652#define vg_assert(expr) \
653 ((void) ((expr) ? 0 : \
654 (VG_(assert_fail) (__STRING(expr), \
655 __FILE__, __LINE__, \
656 __PRETTY_FUNCTION__), 0)))
657
658extern void VG_(assert_fail) ( Char* expr, Char* file,
659 Int line, Char* fn )
660 __attribute__ ((__noreturn__));
661
sewardjde4a1d02002-03-22 01:27:54 +0000662/* Reading files. */
663extern Int VG_(open_read) ( Char* pathname );
664extern void VG_(close) ( Int fd );
665extern Int VG_(read) ( Int fd, void* buf, Int count);
666extern Int VG_(write) ( Int fd, void* buf, Int count);
667
sewardj2e93c502002-04-12 11:12:52 +0000668extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
669
670extern Int VG_(select)( Int n,
671 vki_fd_set* readfds,
672 vki_fd_set* writefds,
673 vki_fd_set* exceptfds,
674 struct vki_timeval * timeout );
675extern Int VG_(nanosleep)( const struct vki_timespec *req,
676 struct vki_timespec *rem );
677
678
sewardjde4a1d02002-03-22 01:27:54 +0000679/* mmap-ery ... */
680extern void* VG_(mmap)( void* start, UInt length,
681 UInt prot, UInt flags, UInt fd, UInt offset );
682
sewardj2e93c502002-04-12 11:12:52 +0000683extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000684
685
686/* Print a (panic) message, and abort. */
687extern void VG_(panic) ( Char* str )
688 __attribute__ ((__noreturn__));
689
690/* Get memory by anonymous mmap. */
691void* VG_(get_memory_from_mmap) ( Int nBytes );
692
693/* Signal stuff. Note that these use the vk_ (kernel) structure
694 definitions, which are different in places from those that glibc
695 defines. Since we're operating right at the kernel interface,
696 glibc's view of the world is entirely irrelevant. */
697extern Int VG_(ksigfillset)( vki_ksigset_t* set );
698extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
699extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
700
701extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
702 vki_ksigset_t* oldset );
703extern Int VG_(ksigaction) ( Int signum,
704 const vki_ksigaction* act,
705 vki_ksigaction* oldact );
706extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
707
708extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
709
710extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
711
712
713
714/* ---------------------------------------------------------------------
715 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
716 vg_from_ucode.c).
717 ------------------------------------------------------------------ */
718
719/* Tags which describe what operands are. */
720typedef
721 enum { TempReg=0, ArchReg=1, RealReg=2,
722 SpillNo=3, Literal=4, Lit16=5,
723 NoValue=6 }
724 Tag;
725
726
727/* Microinstruction opcodes. */
728typedef
729 enum {
730 NOP,
731 GET,
732 PUT,
733 LOAD,
734 STORE,
735 MOV,
736 CMOV, /* Used for cmpxchg and cmov */
737 WIDEN,
738 JMP,
739
740 /* Read/write the %EFLAGS register into a TempReg. */
741 GETF, PUTF,
742
743 ADD, ADC, AND, OR, XOR, SUB, SBB,
744 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
745 NOT, NEG, INC, DEC, BSWAP,
746 CC2VAL,
747
748 /* Not strictly needed, but useful for making better
749 translations of address calculations. */
750 LEA1, /* reg2 := const + reg1 */
751 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
752
753 /* not for translating x86 calls -- only to call helpers */
754 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
755 for CALLM. */
756 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
757 CALLM, /* call to a machine-code helper */
758
759 /* Hack for translating string (REP-) insns. Jump to literal if
760 TempReg/RealReg is zero. */
761 JIFZ,
762
763 /* FPU ops which read/write mem or don't touch mem at all. */
764 FPU_R,
765 FPU_W,
766 FPU,
767
768 /* Advance the simulated %eip by some small (< 128) number. */
769 INCEIP,
770
771 /* uinstrs which are not needed for mere translation of x86 code,
772 only for instrumentation of it. */
773 LOADV,
774 STOREV,
775 GETV,
776 PUTV,
777 TESTV,
778 SETV,
779 /* Get/set the v-bit (and it is only one bit) for the simulated
780 %eflags register. */
781 GETVF,
782 PUTVF,
783
784 /* Do a unary or binary tag op. Only for post-instrumented
785 code. For TAG1, first and only arg is a TempReg, and is both
786 arg and result reg. For TAG2, first arg is src, second is
787 dst, in the normal way; both are TempRegs. In both cases,
788 3rd arg is a RiCHelper with a Lit16 tag. This indicates
789 which tag op to do. */
790 TAG1,
791 TAG2
792 }
793 Opcode;
794
795
796/* Condition codes, observing the Intel encoding. CondAlways is an
797 extra. */
798typedef
799 enum {
800 CondO = 0, /* overflow */
801 CondNO = 1, /* no overflow */
802 CondB = 2, /* below */
803 CondNB = 3, /* not below */
804 CondZ = 4, /* zero */
805 CondNZ = 5, /* not zero */
806 CondBE = 6, /* below or equal */
807 CondNBE = 7, /* not below or equal */
808 CondS = 8, /* negative */
809 ConsNS = 9, /* not negative */
810 CondP = 10, /* parity even */
811 CondNP = 11, /* not parity even */
812 CondL = 12, /* jump less */
813 CondNL = 13, /* not less */
814 CondLE = 14, /* less or equal */
815 CondNLE = 15, /* not less or equal */
816 CondAlways = 16 /* Jump always */
817 }
818 Condcode;
819
820
sewardj2e93c502002-04-12 11:12:52 +0000821/* Descriptions of additional properties of *unconditional* jumps. */
822typedef
823 enum {
824 JmpBoring=0, /* boring unconditional jump */
825 JmpCall=1, /* jump due to an x86 call insn */
826 JmpRet=2, /* jump due to an x86 ret insn */
827 JmpSyscall=3, /* do a system call, then jump */
828 JmpClientReq=4 /* do a client request, then jump */
829 }
830 JmpKind;
831
832
sewardjde4a1d02002-03-22 01:27:54 +0000833/* Flags. User-level code can only read/write O(verflow), S(ign),
834 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
835 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
836 thusly:
837 76543210
838 DOSZACP
839 and bit 7 must always be zero since it is unused.
840*/
841typedef UChar FlagSet;
842
843#define FlagD (1<<6)
844#define FlagO (1<<5)
845#define FlagS (1<<4)
846#define FlagZ (1<<3)
847#define FlagA (1<<2)
848#define FlagC (1<<1)
849#define FlagP (1<<0)
850
851#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
852#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
853#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
854#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
855#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
856#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +0000857#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +0000858#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +0000859#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +0000860
861#define FlagsALL (FlagsOSZACP | FlagD)
862#define FlagsEmpty (FlagSet)0
863
864#define VG_IS_FLAG_SUBSET(set1,set2) \
865 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
866
867#define VG_UNION_FLAG_SETS(set1,set2) \
868 ( ((FlagSet)set1) | ((FlagSet)set2) )
869
870
871
872/* A Micro (u)-instruction. */
873typedef
874 struct {
875 /* word 1 */
876 UInt lit32; /* 32-bit literal */
877
878 /* word 2 */
879 UShort val1; /* first operand */
880 UShort val2; /* second operand */
881
882 /* word 3 */
883 UShort val3; /* third operand */
884 UChar opcode; /* opcode */
885 UChar size; /* data transfer size */
886
887 /* word 4 */
888 FlagSet flags_r; /* :: FlagSet */
889 FlagSet flags_w; /* :: FlagSet */
890 UChar tag1:4; /* first operand tag */
891 UChar tag2:4; /* second operand tag */
892 UChar tag3:4; /* third operand tag */
893 UChar extra4b:4; /* Spare field, used by WIDEN for src
894 -size, and by LEA2 for scale
895 (1,2,4 or 8) */
896
897 /* word 5 */
898 UChar cond; /* condition, for jumps */
899 Bool smc_check:1; /* do a smc test, if writes memory. */
900 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +0000901 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +0000902 }
903 UInstr;
904
905
906/* Expandable arrays of uinstrs. */
907typedef
908 struct {
909 Int used;
910 Int size;
911 UInstr* instrs;
912 Int nextTemp;
913 }
914 UCodeBlock;
915
916/* Refer to `the last instruction stuffed in', including as an
917 lvalue. */
918#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
919
920/* An invalid temporary number :-) */
921#define INVALID_TEMPREG 999999999
922
923
924/* ---------------------------------------------------------------------
925 Exports of vg_demangle.c
926 ------------------------------------------------------------------ */
927
928extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
929
930
931/* ---------------------------------------------------------------------
932 Exports of vg_from_ucode.c
933 ------------------------------------------------------------------ */
934
935extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
936
937
938/* ---------------------------------------------------------------------
939 Exports of vg_to_ucode.c
940 ------------------------------------------------------------------ */
941
942extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
943extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
944extern Char VG_(nameOfIntSize) ( Int size );
945extern UInt VG_(extend_s_8to32) ( UInt x );
946extern Int VG_(getNewTemp) ( UCodeBlock* cb );
947extern Int VG_(getNewShadow) ( UCodeBlock* cb );
948
949#define SHADOW(tempreg) ((tempreg)+1)
950
951
952/* ---------------------------------------------------------------------
953 Exports of vg_translate.c
954 ------------------------------------------------------------------ */
955
956extern void VG_(translate) ( Addr orig_addr,
957 UInt* orig_size,
958 Addr* trans_addr,
959 UInt* trans_size );
960
961extern void VG_(emptyUInstr) ( UInstr* u );
962extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
963extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
964 Tag tag1, UInt val1 );
965extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
966 Tag tag1, UInt val1,
967 Tag tag2, UInt val2 );
968extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
969 Tag tag1, UInt val1,
970 Tag tag2, UInt val2,
971 Tag tag3, UInt val3 );
972extern void VG_(setFlagRW) ( UInstr* u,
973 FlagSet fr, FlagSet fw );
974
975extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
976extern Bool VG_(anyFlagUse) ( UInstr* u );
977
978
979
980extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
981extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
982
983extern Char* VG_(nameCondcode) ( Condcode cond );
984extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
985extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
986extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
987extern Int VG_(rankToRealRegNo) ( Int rank );
988
989extern void* VG_(jitmalloc) ( Int nbytes );
990extern void VG_(jitfree) ( void* ptr );
991
992
993/* ---------------------------------------------------------------------
994 Exports of vg_execontext.c.
995 ------------------------------------------------------------------ */
996
997/* Records the PC and a bit of the call chain. The first 4 %eip
998 values are used in comparisons do remove duplicate errors, and for
999 comparing against suppression specifications. The rest are purely
1000 informational (but often important). */
1001
1002typedef
1003 struct _ExeContextRec {
1004 struct _ExeContextRec * next;
1005 /* The size of this array is VG_(clo_backtrace_size); at least
1006 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1007 [1] is its caller, [2] is the caller of [1], etc. */
1008 Addr eips[0];
1009 }
1010 ExeContext;
1011
1012
1013/* Initialise the ExeContext storage mechanism. */
1014extern void VG_(init_ExeContext_storage) ( void );
1015
1016/* Print stats (informational only). */
1017extern void VG_(show_ExeContext_stats) ( void );
1018
1019
1020/* Take a snapshot of the client's stack. Search our collection of
1021 ExeContexts to see if we already have it, and if not, allocate a
1022 new one. Either way, return a pointer to the context. */
1023extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame );
1024
1025/* Print an ExeContext. */
1026extern void VG_(pp_ExeContext) ( ExeContext* );
1027
1028/* Compare two ExeContexts, just comparing the top two callers. */
1029extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1030
1031/* Compare two ExeContexts, just comparing the top four callers. */
1032extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1033
1034/* Compare two ExeContexts, comparing all callers. */
1035extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1036
1037
1038
1039/* ---------------------------------------------------------------------
1040 Exports of vg_errcontext.c.
1041 ------------------------------------------------------------------ */
1042
1043extern void VG_(load_suppressions) ( void );
1044extern void VG_(show_all_errors) ( void );
1045extern void VG_(record_value_error) ( Int size );
1046extern void VG_(record_free_error) ( Addr a );
1047extern void VG_(record_freemismatch_error) ( Addr a );
1048extern void VG_(record_address_error) ( Addr a, Int size,
1049 Bool isWrite );
1050extern void VG_(record_jump_error) ( Addr a );
1051extern void VG_(record_param_err) ( Addr a,
1052 Bool isWriteLack,
1053 Char* msg );
1054extern void VG_(record_user_err) ( Addr a, Bool isWriteLack );
1055
1056
1057/* The classification of a faulting address. */
1058typedef
1059 enum { Stack, Unknown, Freed, Mallocd, UserG, UserS }
1060 AddrKind;
1061
1062/* Records info about a faulting address. */
1063typedef
1064 struct {
1065 /* ALL */
1066 AddrKind akind;
1067 /* Freed, Mallocd */
1068 Int blksize;
1069 /* Freed, Mallocd */
1070 Int rwoffset;
1071 /* Freed, Mallocd */
1072 ExeContext* lastchange;
1073 }
1074 AddrInfo;
1075
1076
1077/* ---------------------------------------------------------------------
1078 Exports of vg_clientperms.c
1079 ------------------------------------------------------------------ */
1080
1081extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1082
sewardj2e93c502002-04-12 11:12:52 +00001083extern UInt VG_(handle_client_request) ( UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001084
1085extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1086
1087extern void VG_(show_client_block_stats) ( void );
1088
1089
1090/* ---------------------------------------------------------------------
1091 Exports of vg_procselfmaps.c
1092 ------------------------------------------------------------------ */
1093
1094extern
1095void VG_(read_procselfmaps) (
1096 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1097);
1098
1099
1100/* ---------------------------------------------------------------------
1101 Exports of vg_symtab2.c
1102 ------------------------------------------------------------------ */
1103
1104/* We assume the executable is loaded here ... can't really find
1105 out. There is a hacky sanity check in vg_init_memory_audit()
1106 which should trip up most stupidities.
1107*/
1108#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1109
1110extern void VG_(read_symbols) ( void );
1111extern void VG_(mini_stack_dump) ( ExeContext* ec );
1112extern void VG_(what_obj_and_fun_is_this)
1113 ( Addr a,
1114 Char* obj_buf, Int n_obj_buf,
1115 Char* fun_buf, Int n_fun_buf );
1116
1117extern void VG_(symtab_notify_munmap) ( Addr start, UInt length );
1118
1119
1120/* ---------------------------------------------------------------------
1121 Exports of vg_clientmalloc.c
1122 ------------------------------------------------------------------ */
1123
sewardjde4a1d02002-03-22 01:27:54 +00001124typedef
1125 enum {
1126 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001127 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001128 Vg_AllocNewVec = 2
1129 }
1130 VgAllocKind;
1131
1132/* Description of a malloc'd chunk. */
1133typedef
1134 struct _ShadowChunk {
1135 struct _ShadowChunk* next;
1136 ExeContext* where; /* where malloc'd/free'd */
1137 UInt size : 30; /* size requested. */
1138 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1139 Addr data; /* ptr to actual block. */
1140 }
1141 ShadowChunk;
1142
1143extern void VG_(clientmalloc_done) ( void );
1144extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1145extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1146
sewardj2e93c502002-04-12 11:12:52 +00001147/* These are called from the scheduler, when it intercepts a user
1148 request. */
1149extern void* VG_(client_malloc) ( UInt size, VgAllocKind kind );
1150extern void* VG_(client_memalign) ( UInt align, UInt size );
1151extern void VG_(client_free) ( void* ptrV, VgAllocKind kind );
1152extern void* VG_(client_calloc) ( UInt nmemb, UInt size1 );
1153extern void* VG_(client_realloc) ( void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001154
1155
1156/* ---------------------------------------------------------------------
1157 Exports of vg_main.c
1158 ------------------------------------------------------------------ */
1159
sewardjde4a1d02002-03-22 01:27:54 +00001160/* A structure used as an intermediary when passing the simulated
1161 CPU's state to some assembly fragments, particularly system calls.
1162 Stuff is copied from baseBlock to here, the assembly magic runs,
1163 and then the inverse copy is done. */
1164
1165extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1166 + 1 /* %eflags */
1167 + 1 /* %eip */
1168 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1169 ];
1170
1171/* Handy fns for doing the copy back and forth. */
1172extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1173extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1174
sewardjde4a1d02002-03-22 01:27:54 +00001175/* Called when some unhandleable client behaviour is detected.
1176 Prints a msg and aborts. */
1177extern void VG_(unimplemented) ( Char* msg );
1178
1179/* The stack on which Valgrind runs. We can't use the same stack as the
1180 simulatee -- that's an important design decision. */
1181extern UInt VG_(stack)[10000];
1182
1183/* Similarly, we have to ask for signals to be delivered on an
1184 alternative stack, since it is possible, although unlikely, that
1185 we'll have to run client code from inside the Valgrind-installed
1186 signal handler. If this happens it will be done by
1187 vg_deliver_signal_immediately(). */
1188extern UInt VG_(sigstack)[10000];
1189
sewardjde4a1d02002-03-22 01:27:54 +00001190/* Holds client's %esp at the point we gained control. From this the
1191 client's argc, argv and envp are deduced. */
1192extern Addr VG_(esp_at_startup);
1193extern Int VG_(client_argc);
1194extern Char** VG_(client_argv);
1195extern Char** VG_(client_envp);
1196
1197/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
1198 don't get traced into. */
1199extern void VG_(mash_LD_PRELOAD_string)( Char* ld_preload_str );
1200
1201/* Something of a function looking for a home ... start up GDB. This
1202 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1203 *client's* stack. This is necessary to give GDB the illusion that
1204 the client program really was running on the real cpu. */
1205extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1206
1207/* Spew out vast amounts of junk during JITting? */
1208extern Bool VG_(disassemble);
1209
1210/* 64-bit counter for the number of basic blocks done. */
1211extern ULong VG_(bbs_done);
1212/* 64-bit counter for the number of bbs to go before a debug exit. */
1213extern ULong VG_(bbs_to_go);
1214
1215/* Counts downwards in vg_run_innerloop. */
1216extern UInt VG_(dispatch_ctr);
1217
sewardjde4a1d02002-03-22 01:27:54 +00001218/* Is the client running on the simulated CPU or the real one? */
1219extern Bool VG_(running_on_simd_CPU); /* Initially False */
1220
1221/* The current LRU epoch. */
1222extern UInt VG_(current_epoch);
1223
1224
1225/* --- Counters, for informational purposes only. --- */
1226
1227/* Number of lookups which miss the fast tt helper. */
1228extern UInt VG_(tt_fast_misses);
1229
1230/* Counts for LRU informational messages. */
1231
1232/* Number and total o/t size of new translations this epoch. */
1233extern UInt VG_(this_epoch_in_count);
1234extern UInt VG_(this_epoch_in_osize);
1235extern UInt VG_(this_epoch_in_tsize);
1236/* Number and total o/t size of discarded translations this epoch. */
1237extern UInt VG_(this_epoch_out_count);
1238extern UInt VG_(this_epoch_out_osize);
1239extern UInt VG_(this_epoch_out_tsize);
1240/* Number and total o/t size of translations overall. */
1241extern UInt VG_(overall_in_count);
1242extern UInt VG_(overall_in_osize);
1243extern UInt VG_(overall_in_tsize);
1244/* Number and total o/t size of discards overall. */
1245extern UInt VG_(overall_out_count);
1246extern UInt VG_(overall_out_osize);
1247extern UInt VG_(overall_out_tsize);
1248
1249/* The number of LRU-clearings of TT/TC. */
1250extern UInt VG_(number_of_lrus);
1251
1252/* Counts pertaining to the register allocator. */
1253
1254/* total number of uinstrs input to reg-alloc */
1255extern UInt VG_(uinstrs_prealloc);
1256
1257/* total number of uinstrs added due to spill code */
1258extern UInt VG_(uinstrs_spill);
1259
1260/* number of bbs requiring spill code */
1261extern UInt VG_(translations_needing_spill);
1262
1263/* total of register ranks over all translations */
1264extern UInt VG_(total_reg_rank);
1265
1266/* Counts pertaining to the self-modifying-code detection machinery. */
1267
1268/* Total number of writes checked. */
1269//extern UInt VG_(smc_total_check4s);
1270
1271/* Number of writes which the fast smc check couldn't show were
1272 harmless. */
1273extern UInt VG_(smc_cache_passed);
1274
1275/* Numnber of writes which really did write on original code. */
1276extern UInt VG_(smc_fancy_passed);
1277
1278/* Number of translations discarded as a result. */
1279//extern UInt VG_(smc_discard_count);
1280
1281/* Counts pertaining to internal sanity checking. */
1282extern UInt VG_(sanity_fast_count);
1283extern UInt VG_(sanity_slow_count);
1284
sewardj2e93c502002-04-12 11:12:52 +00001285/* Counts pertaining to the scheduler. */
1286extern UInt VG_(num_scheduling_events_MINOR);
1287extern UInt VG_(num_scheduling_events_MAJOR);
1288
sewardjde4a1d02002-03-22 01:27:54 +00001289
1290/* ---------------------------------------------------------------------
1291 Exports of vg_memory.c
1292 ------------------------------------------------------------------ */
1293
1294extern void VGM_(init_memory_audit) ( void );
1295extern Addr VGM_(curr_dataseg_end);
1296extern void VG_(show_reg_tags) ( void );
1297extern void VG_(detect_memory_leaks) ( void );
1298extern void VG_(done_prof_mem) ( void );
1299
1300/* Set permissions for an address range. Not speed-critical. */
1301extern void VGM_(make_noaccess) ( Addr a, UInt len );
1302extern void VGM_(make_writable) ( Addr a, UInt len );
1303extern void VGM_(make_readable) ( Addr a, UInt len );
1304/* Use with care! (read: use for shmat only) */
1305extern void VGM_(make_readwritable) ( Addr a, UInt len );
1306extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1307 UInt len );
1308
1309/* Check permissions for an address range. Not speed-critical. */
1310extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1311extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1312extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1313
1314/* Sanity checks which may be done at any time. Doing them at
1315 signal-delivery time turns out to be convenient. */
sewardj2e93c502002-04-12 11:12:52 +00001316extern void VG_(do_sanity_checks) ( ThreadId tid, Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001317/* Very cheap ... */
1318extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1319
1320/* These functions are called from generated code. */
1321extern void VG_(helperc_STOREV4) ( UInt, Addr );
1322extern void VG_(helperc_STOREV2) ( UInt, Addr );
1323extern void VG_(helperc_STOREV1) ( UInt, Addr );
1324
1325extern UInt VG_(helperc_LOADV1) ( Addr );
1326extern UInt VG_(helperc_LOADV2) ( Addr );
1327extern UInt VG_(helperc_LOADV4) ( Addr );
1328
1329extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1330extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1331extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1332
1333/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1334 space and pass the addresses and values of all addressible,
1335 defined, aligned words to notify_word. This is the basis for the
1336 leak detector. Returns the number of calls made to notify_word. */
1337UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1338
1339/* Is this address within some small distance below %ESP? Used only
1340 for the --workaround-gcc296-bugs kludge. */
1341extern Bool VG_(is_just_below_ESP)( Addr aa );
1342
1343/* Nasty kludgery to deal with applications which switch stacks,
1344 like netscape. */
1345#define VG_STACK_STARTS_AT 0xC0000000
1346#define VG_PLAUSIBLE_STACK_SIZE 8000000
1347
1348extern Bool VG_(is_plausible_stack_addr) ( Addr );
1349
1350
1351/* ---------------------------------------------------------------------
1352 Exports of vg_syscall_mem.c
1353 ------------------------------------------------------------------ */
1354
sewardj2e93c502002-04-12 11:12:52 +00001355extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001356
sewardj2e93c502002-04-12 11:12:52 +00001357extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1358 Int syscallno,
1359 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001360
1361extern Bool VG_(is_kerror) ( Int res );
1362
sewardj2e93c502002-04-12 11:12:52 +00001363#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1364 VG_(load_thread_state)(thread_id); \
sewardjde4a1d02002-03-22 01:27:54 +00001365 VG_(copy_baseBlock_to_m_state_static)(); \
1366 VG_(do_syscall)(); \
1367 VG_(copy_m_state_static_to_baseBlock)(); \
sewardj2e93c502002-04-12 11:12:52 +00001368 VG_(save_thread_state)(thread_id); \
1369 result_lvalue = VG_(get_thread_state)(thread_id)->m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001370
1371
1372/* ---------------------------------------------------------------------
1373 Exports of vg_transtab.c
1374 ------------------------------------------------------------------ */
1375
1376/* An entry in the translation table (TT). */
1377typedef
1378 struct {
1379 /* +0 */ Addr orig_addr;
1380 /* +4 */ Addr trans_addr;
1381 /* +8 */ UInt mru_epoch;
1382 /* +12 */ UShort orig_size;
1383 /* +14 */ UShort trans_size;
1384 }
1385 TTEntry;
1386
1387/* The number of basic blocks in an epoch (one age-step). */
1388#define VG_BBS_PER_EPOCH 20000
1389
1390extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1391extern void VG_(maybe_do_lru_pass) ( void );
1392extern void VG_(flush_transtab) ( void );
1393extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1394extern void VG_(add_to_trans_tab) ( TTEntry* tte );
1395
1396extern void VG_(smc_mark_original) ( Addr original_addr,
1397 Int original_len );
1398
1399extern void VG_(init_transtab_and_SMC) ( void );
1400
1401extern void VG_(sanity_check_tc_tt) ( void );
1402extern Addr VG_(search_transtab) ( Addr original_addr );
1403
1404extern void VG_(invalidate_tt_fast)( void );
1405
1406
1407/* ---------------------------------------------------------------------
1408 Exports of vg_vtagops.c
1409 ------------------------------------------------------------------ */
1410
1411/* Lists the names of value-tag operations used in instrumented
1412 code. These are the third argument to TAG1 and TAG2 uinsns. */
1413
1414typedef
1415 enum {
1416 /* Unary. */
1417 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1418 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1419
1420 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1421
1422 VgT_Left4, VgT_Left2, VgT_Left1,
1423
1424 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1425 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1426
1427 /* Binary; 1st is rd; 2nd is rd+wr */
1428 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1429 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1430
1431 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1432 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1433 VgT_DebugFn
1434 }
1435 VgTagOp;
1436
1437extern Char* VG_(nameOfTagOp) ( VgTagOp );
1438extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1439
1440
1441/* ---------------------------------------------------------------------
1442 Exports of vg_syscall.S
1443 ------------------------------------------------------------------ */
1444
1445extern void VG_(do_syscall) ( void );
1446
1447
1448/* ---------------------------------------------------------------------
1449 Exports of vg_startup.S
1450 ------------------------------------------------------------------ */
1451
1452extern void VG_(shutdown);
1453extern void VG_(switch_to_real_CPU) ( void );
1454
1455extern void VG_(swizzle_esp_then_start_GDB) ( void );
1456
1457
1458/* ---------------------------------------------------------------------
1459 Exports of vg_dispatch.S
1460 ------------------------------------------------------------------ */
1461
sewardj2e93c502002-04-12 11:12:52 +00001462/* Run a thread for a (very short) while, until some event happens
1463 which means we need to defer to the scheduler. */
1464extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001465
1466
1467/* ---------------------------------------------------------------------
1468 Exports of vg_helpers.S
1469 ------------------------------------------------------------------ */
1470
sewardjde4a1d02002-03-22 01:27:54 +00001471/* SMC fast checks. */
1472extern void VG_(helper_smc_check4);
1473
1474/* Mul, div, etc, -- we don't codegen these directly. */
1475extern void VG_(helper_idiv_64_32);
1476extern void VG_(helper_div_64_32);
1477extern void VG_(helper_idiv_32_16);
1478extern void VG_(helper_div_32_16);
1479extern void VG_(helper_idiv_16_8);
1480extern void VG_(helper_div_16_8);
1481
1482extern void VG_(helper_imul_32_64);
1483extern void VG_(helper_mul_32_64);
1484extern void VG_(helper_imul_16_32);
1485extern void VG_(helper_mul_16_32);
1486extern void VG_(helper_imul_8_16);
1487extern void VG_(helper_mul_8_16);
1488
1489extern void VG_(helper_CLD);
1490extern void VG_(helper_STD);
1491extern void VG_(helper_get_dirflag);
1492
1493extern void VG_(helper_shldl);
1494extern void VG_(helper_shldw);
1495extern void VG_(helper_shrdl);
1496extern void VG_(helper_shrdw);
1497
1498extern void VG_(helper_RDTSC);
1499extern void VG_(helper_CPUID);
1500
1501extern void VG_(helper_bt);
1502extern void VG_(helper_bts);
1503extern void VG_(helper_btr);
1504extern void VG_(helper_btc);
1505
1506extern void VG_(helper_bsf);
1507extern void VG_(helper_bsr);
1508
1509extern void VG_(helper_fstsw_AX);
1510extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001511extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001512extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001513
1514extern void VG_(helper_value_check4_fail);
1515extern void VG_(helper_value_check2_fail);
1516extern void VG_(helper_value_check1_fail);
1517extern void VG_(helper_value_check0_fail);
1518
sewardjde4a1d02002-03-22 01:27:54 +00001519
1520/* ---------------------------------------------------------------------
1521 The state of the simulated CPU.
1522 ------------------------------------------------------------------ */
1523
1524/* This is the Intel register encoding. */
1525#define R_EAX 0
1526#define R_ECX 1
1527#define R_EDX 2
1528#define R_EBX 3
1529#define R_ESP 4
1530#define R_EBP 5
1531#define R_ESI 6
1532#define R_EDI 7
1533
1534#define R_AL (0+R_EAX)
1535#define R_CL (0+R_ECX)
1536#define R_DL (0+R_EDX)
1537#define R_BL (0+R_EBX)
1538#define R_AH (4+R_EAX)
1539#define R_CH (4+R_ECX)
1540#define R_DH (4+R_EDX)
1541#define R_BH (4+R_EBX)
1542
1543
1544/* ---------------------------------------------------------------------
1545 Offsets into baseBlock for everything which needs to referred to
1546 from generated code. The order of these decls does not imply
1547 what the order of the actual offsets is. The latter is important
1548 and is set up in vg_main.c.
1549 ------------------------------------------------------------------ */
1550
1551/* An array of words. In generated code, %ebp always points to the
1552 start of this array. Useful stuff, like the simulated CPU state,
1553 and the addresses of helper functions, can then be found by
1554 indexing off %ebp. The following declares variables which, at
1555 startup time, are given values denoting offsets into baseBlock.
1556 These offsets are in *words* from the start of baseBlock. */
1557
1558#define VG_BASEBLOCK_WORDS 200
1559
1560extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1561
1562
1563/* -----------------------------------------------------
1564 Read-write parts of baseBlock.
1565 -------------------------------------------------- */
1566
1567/* State of the simulated CPU. */
1568extern Int VGOFF_(m_eax);
1569extern Int VGOFF_(m_ecx);
1570extern Int VGOFF_(m_edx);
1571extern Int VGOFF_(m_ebx);
1572extern Int VGOFF_(m_esp);
1573extern Int VGOFF_(m_ebp);
1574extern Int VGOFF_(m_esi);
1575extern Int VGOFF_(m_edi);
1576extern Int VGOFF_(m_eflags);
1577extern Int VGOFF_(m_fpustate);
1578extern Int VGOFF_(m_eip);
1579
1580/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1581extern Int VGOFF_(spillslots);
1582
1583/* Records the valid bits for the 8 integer regs & flags reg. */
1584extern Int VGOFF_(sh_eax);
1585extern Int VGOFF_(sh_ecx);
1586extern Int VGOFF_(sh_edx);
1587extern Int VGOFF_(sh_ebx);
1588extern Int VGOFF_(sh_esp);
1589extern Int VGOFF_(sh_ebp);
1590extern Int VGOFF_(sh_esi);
1591extern Int VGOFF_(sh_edi);
1592extern Int VGOFF_(sh_eflags);
1593
1594
1595/* -----------------------------------------------------
1596 Read-only parts of baseBlock.
1597 -------------------------------------------------- */
1598
1599/* Offsets of addresses of helper functions. A "helper" function is
1600 one which is called from generated code. */
1601
1602extern Int VGOFF_(helper_idiv_64_32);
1603extern Int VGOFF_(helper_div_64_32);
1604extern Int VGOFF_(helper_idiv_32_16);
1605extern Int VGOFF_(helper_div_32_16);
1606extern Int VGOFF_(helper_idiv_16_8);
1607extern Int VGOFF_(helper_div_16_8);
1608
1609extern Int VGOFF_(helper_imul_32_64);
1610extern Int VGOFF_(helper_mul_32_64);
1611extern Int VGOFF_(helper_imul_16_32);
1612extern Int VGOFF_(helper_mul_16_32);
1613extern Int VGOFF_(helper_imul_8_16);
1614extern Int VGOFF_(helper_mul_8_16);
1615
1616extern Int VGOFF_(helper_CLD);
1617extern Int VGOFF_(helper_STD);
1618extern Int VGOFF_(helper_get_dirflag);
1619
1620extern Int VGOFF_(helper_shldl);
1621extern Int VGOFF_(helper_shldw);
1622extern Int VGOFF_(helper_shrdl);
1623extern Int VGOFF_(helper_shrdw);
1624
1625extern Int VGOFF_(helper_RDTSC);
1626extern Int VGOFF_(helper_CPUID);
1627
1628extern Int VGOFF_(helper_bt);
1629extern Int VGOFF_(helper_bts);
1630extern Int VGOFF_(helper_btr);
1631extern Int VGOFF_(helper_btc);
1632
1633extern Int VGOFF_(helper_bsf);
1634extern Int VGOFF_(helper_bsr);
1635
1636extern Int VGOFF_(helper_fstsw_AX);
1637extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001638extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001639extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001640
1641extern Int VGOFF_(helper_value_check4_fail);
1642extern Int VGOFF_(helper_value_check2_fail);
1643extern Int VGOFF_(helper_value_check1_fail);
1644extern Int VGOFF_(helper_value_check0_fail);
1645
sewardjde4a1d02002-03-22 01:27:54 +00001646extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1647extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1648extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1649
1650extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1651extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1652extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1653
1654extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1655extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1656extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1657
sewardjde4a1d02002-03-22 01:27:54 +00001658
1659
1660#endif /* ndef __VG_INCLUDE_H */
1661
sewardj3b2736a2002-03-24 12:18:35 +00001662
1663/* ---------------------------------------------------------------------
1664 Finally - autoconf-generated settings
1665 ------------------------------------------------------------------ */
1666
1667#include "config.h"
1668
sewardjde4a1d02002-03-22 01:27:54 +00001669/*--------------------------------------------------------------------*/
1670/*--- end vg_include.h ---*/
1671/*--------------------------------------------------------------------*/