blob: 6c28cd4e0d9d37dbe2530ba2414d17fb43b14750 [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
sewardjde4a1d02002-03-22 01:27:54 +000014
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License as
17 published by the Free Software Foundation; either version 2 of the
18 License, or (at your option) any later version.
19
20 This program is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with this program; if not, write to the Free Software
27 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28 02111-1307, USA.
29
30 The GNU General Public License is contained in the file LICENSE.
31*/
32
33#ifndef __VG_INCLUDE_H
34#define __VG_INCLUDE_H
35
36
37#include <stdarg.h> /* ANSI varargs stuff */
38#include <setjmp.h> /* for jmp_buf */
39
40
41/* ---------------------------------------------------------------------
sewardj2d94c112002-06-03 01:25:54 +000042 Where to send bug reports to.
43 ------------------------------------------------------------------ */
44
45#define VG_EMAIL_ADDR "jseward@acm.org"
46
47
48/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +000049 Build options and table sizes. You should be able to change these
50 options or sizes, recompile, and still have a working system.
51 ------------------------------------------------------------------ */
52
53#include "vg_constants.h"
54
55
56/* Set to 1 to enable time profiling. Since this uses SIGPROF, we
57 don't want this permanently enabled -- only for profiling
58 builds. */
59#if 0
60# define VG_PROFILE
61#endif
62
63
64/* Total number of integer registers available for allocation. That's
65 all of them except %esp, %edi and %ebp. %edi is a general spare
66 temporary. %ebp permanently points at VG_(baseBlock). Note that
67 it's important that this tie in with what rankToRealRegNo() says.
68 DO NOT CHANGE THIS VALUE FROM 5. ! */
69#define VG_MAX_REALREGS 5
70
71/* Total number of spill slots available for allocation, if a TempReg
72 doesn't make it into a RealReg. Just bomb the entire system if
73 this value is too small; we don't expect it will ever get
74 particularly high. */
75#define VG_MAX_SPILLSLOTS 24
76
77
78/* Constants for the slow translation lookup cache. */
79#define VG_TRANSTAB_SLOW_BITS 11
80#define VG_TRANSTAB_SLOW_SIZE (1 << VG_TRANSTAB_SLOW_BITS)
81#define VG_TRANSTAB_SLOW_MASK ((VG_TRANSTAB_SLOW_SIZE) - 1)
82
83/* Size of a buffer used for creating messages. */
84#define M_VG_MSGBUF 10000
85
86/* Size of a smallish table used to read /proc/self/map entries. */
sewardjebc82332002-04-24 14:44:23 +000087#define M_PROCMAP_BUF 50000
sewardjde4a1d02002-03-22 01:27:54 +000088
89/* Max length of pathname to a .so/executable file. */
90#define M_VG_LIBNAMESTR 100
91
92/* Max length of a text fragment used to construct error messages. */
93#define M_VG_ERRTXT 512
94
95/* Max length of the string copied from env var VG_ARGS at startup. */
96#define M_VG_CMDLINE_STRLEN 1000
97
98/* Max number of options for Valgrind which we can handle. */
99#define M_VG_CMDLINE_OPTS 100
100
101/* After this many different unsuppressed errors have been observed,
102 be more conservative about collecting new ones. */
103#define M_VG_COLLECT_ERRORS_SLOWLY_AFTER 50
104
105/* After this many different unsuppressed errors have been observed,
106 stop collecting errors at all, and tell the user their program is
107 evidently a steaming pile of camel dung. */
sewardj1bebcbf2002-04-24 21:24:18 +0000108#define M_VG_COLLECT_NO_ERRORS_AFTER_SHOWN 300
sewardjf2537be2002-04-24 21:03:47 +0000109
110/* After this many total errors have been observed, stop collecting
111 errors at all. Counterpart to M_VG_COLLECT_NO_ERRORS_AFTER_SHOWN. */
sewardj1bebcbf2002-04-24 21:24:18 +0000112#define M_VG_COLLECT_NO_ERRORS_AFTER_FOUND 30000
sewardjde4a1d02002-03-22 01:27:54 +0000113
114/* These many bytes below %ESP are considered addressible if we're
115 doing the --workaround-gcc296-bugs hack. */
sewardjb581a132002-05-08 00:32:50 +0000116#define VG_GCC296_BUG_STACK_SLOP 1024
sewardjde4a1d02002-03-22 01:27:54 +0000117
118/* The maximum number of calls we're prepared to save in a
119 backtrace. */
120#define VG_DEEPEST_BACKTRACE 50
121
122/* Number of lists in which we keep track of malloc'd but not free'd
123 blocks. Should be prime. */
124#define VG_N_MALLOCLISTS 997
125
126/* Number of lists in which we keep track of ExeContexts. Should be
127 prime. */
128#define VG_N_EC_LISTS /*997*/ 4999
129
sewardj2e93c502002-04-12 11:12:52 +0000130/* Defines the thread-scheduling timeslice, in terms of the number of
131 basic blocks we attempt to run each thread for. Smaller values
132 give finer interleaving but much increased scheduling overheads. */
sewardj4505b9e2002-05-28 11:27:31 +0000133#define VG_SCHEDULING_QUANTUM 50000
sewardj2e93c502002-04-12 11:12:52 +0000134
135/* The maximum number of pthreads that we support. This is
136 deliberately not very high since our implementation of some of the
sewardj5f07b662002-04-23 16:52:51 +0000137 scheduler algorithms is surely O(N) in the number of threads, since
138 that's simple, at least. And (in practice) we hope that most
sewardj2e93c502002-04-12 11:12:52 +0000139 programs do not need many threads. */
sewardj7989d0c2002-05-28 11:00:01 +0000140#define VG_N_THREADS 20
sewardj5f07b662002-04-23 16:52:51 +0000141
142/* Maximum number of pthread keys available. Again, we start low until
143 the need for a higher number presents itself. */
144#define VG_N_THREAD_KEYS 10
sewardj2e93c502002-04-12 11:12:52 +0000145
146/* Number of file descriptors that can simultaneously be waited on for
147 I/O to complete. Perhaps this should be the same as VG_N_THREADS
148 (surely a thread can't wait on more than one fd at once?. Who
149 knows.) */
150#define VG_N_WAITING_FDS 10
151
sewardjbf290b92002-05-01 02:28:01 +0000152/* Stack size for a thread. We try and check that they do not go
153 beyond it. */
sewardjf0b06452002-06-04 08:38:04 +0000154#define VG_PTHREAD_STACK_SIZE (1 << 20)
sewardjbf290b92002-05-01 02:28:01 +0000155
sewardj20917d82002-05-28 01:36:45 +0000156/* Number of entries in the semaphore-remapping table. */
157#define VG_N_SEMAPHORES 50
158
159/* Number of entries in the rwlock-remapping table. */
160#define VG_N_RWLOCKS 50
161
sewardj8ad94e12002-05-29 00:10:20 +0000162/* Number of entries in each thread's cleanup stack. */
163#define VG_N_CLEANUPSTACK 8
164
sewardjde4a1d02002-03-22 01:27:54 +0000165
166/* ---------------------------------------------------------------------
167 Basic types
168 ------------------------------------------------------------------ */
169
170typedef unsigned char UChar;
171typedef unsigned short UShort;
172typedef unsigned int UInt;
173typedef unsigned long long int ULong;
174
175typedef signed char Char;
176typedef signed short Short;
177typedef signed int Int;
178typedef signed long long int Long;
179
180typedef unsigned int Addr;
181
182typedef unsigned char Bool;
183#define False ((Bool)0)
184#define True ((Bool)1)
185
186#define mycat_wrk(aaa,bbb) aaa##bbb
187#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
188
189/* Just pray that gcc's constant folding works properly ... */
190#define BITS(bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0) \
191 ( ((bit7) << 7) | ((bit6) << 6) | ((bit5) << 5) | ((bit4) << 4) \
192 | ((bit3) << 3) | ((bit2) << 2) | ((bit1) << 1) | (bit0))
193
njn7cf0bd32002-06-08 13:36:03 +0000194/* For cache simulation */
195typedef struct {
196 int size; /* bytes */
197 int assoc;
198 int line_size; /* bytes */
199} cache_t;
200
201#define UNDEFINED_CACHE ((cache_t) { -1, -1, -1 })
sewardjde4a1d02002-03-22 01:27:54 +0000202
203/* ---------------------------------------------------------------------
204 Now the basic types are set up, we can haul in the kernel-interface
205 definitions.
206 ------------------------------------------------------------------ */
207
208#include "./vg_kerneliface.h"
209
210
211/* ---------------------------------------------------------------------
212 Command-line-settable options
213 ------------------------------------------------------------------ */
214
215#define VG_CLO_SMC_NONE 0
216#define VG_CLO_SMC_SOME 1
217#define VG_CLO_SMC_ALL 2
218
219#define VG_CLO_MAX_SFILES 10
220
sewardj72f98ff2002-06-13 17:23:38 +0000221/* Should we stop collecting errors if too many appear? default: YES */
sewardj2e432902002-06-13 20:44:00 +0000222extern Bool VG_(clo_error_limit);
sewardj97ced732002-03-25 00:07:36 +0000223/* Shall we V-check addrs (they are always A checked too): default: YES */
sewardj72f98ff2002-06-13 17:23:38 +0000224extern Bool VG_(clo_check_addrVs);
sewardjde4a1d02002-03-22 01:27:54 +0000225/* Enquire about whether to attach to GDB at errors? default: NO */
226extern Bool VG_(clo_GDB_attach);
227/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
228extern Int VG_(sanity_level);
229/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
230extern Int VG_(clo_verbosity);
231/* Automatically attempt to demangle C++ names? default: YES */
232extern Bool VG_(clo_demangle);
233/* Do leak check at exit? default: NO */
234extern Bool VG_(clo_leak_check);
235/* In leak check, show reachable-but-not-freed blocks? default: NO */
236extern Bool VG_(clo_show_reachable);
237/* How closely should we compare ExeContexts in leak records? default: 2 */
238extern Int VG_(clo_leak_resolution);
239/* Round malloc sizes upwards to integral number of words? default:
240 NO */
241extern Bool VG_(clo_sloppy_malloc);
sewardj246d4662002-06-14 10:17:05 +0000242/* Minimum alignment in functions that don't specify alignment explicitly.
243 default: 0, i.e. use default of the machine (== 4) */
244extern Int VG_(clo_alignment);
sewardjde4a1d02002-03-22 01:27:54 +0000245/* Allow loads from partially-valid addresses? default: YES */
246extern Bool VG_(clo_partial_loads_ok);
247/* Simulate child processes? default: NO */
248extern Bool VG_(clo_trace_children);
249/* The file id on which we send all messages. default: 2 (stderr). */
250extern Int VG_(clo_logfile_fd);
251/* Max volume of the freed blocks queue. */
252extern Int VG_(clo_freelist_vol);
253/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
254 default: NO */
255extern Bool VG_(clo_workaround_gcc296_bugs);
256
257/* The number of suppression files specified. */
258extern Int VG_(clo_n_suppressions);
259/* The names of the suppression files. */
260extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
261
262/* Single stepping? default: NO */
263extern Bool VG_(clo_single_step);
264/* Code improvement? default: YES */
265extern Bool VG_(clo_optimise);
266/* Memory-check instrumentation? default: YES */
267extern Bool VG_(clo_instrument);
268/* DEBUG: clean up instrumented code? default: YES */
269extern Bool VG_(clo_cleanup);
njn4f9c9342002-04-29 16:03:24 +0000270/* Cache simulation instrumentation? default: NO */
271extern Bool VG_(clo_cachesim);
njn7cf0bd32002-06-08 13:36:03 +0000272/* I1 cache configuration. default: undefined */
273extern cache_t VG_(clo_I1_cache);
274/* D1 cache configuration. default: undefined */
275extern cache_t VG_(clo_D1_cache);
276/* L2 cache configuration. default: undefined */
277extern cache_t VG_(clo_L2_cache);
sewardjde4a1d02002-03-22 01:27:54 +0000278/* SMC write checks? default: SOME (1,2,4 byte movs to mem) */
279extern Int VG_(clo_smc_check);
280/* DEBUG: print system calls? default: NO */
281extern Bool VG_(clo_trace_syscalls);
282/* DEBUG: print signal details? default: NO */
283extern Bool VG_(clo_trace_signals);
284/* DEBUG: print symtab details? default: NO */
285extern Bool VG_(clo_trace_symtab);
286/* DEBUG: print malloc details? default: NO */
287extern Bool VG_(clo_trace_malloc);
sewardj8937c812002-04-12 20:12:20 +0000288/* DEBUG: print thread scheduling events? default: NO */
289extern Bool VG_(clo_trace_sched);
sewardj45b4b372002-04-16 22:50:32 +0000290/* DEBUG: print pthread (mutex etc) events? default: 0 (none), 1
291 (some), 2 (all) */
292extern Int VG_(clo_trace_pthread_level);
sewardjde4a1d02002-03-22 01:27:54 +0000293/* Stop after this many basic blocks. default: Infinity. */
294extern ULong VG_(clo_stop_after);
295/* Display gory details for the k'th most popular error. default:
296 Infinity. */
297extern Int VG_(clo_dump_error);
298/* Number of parents of a backtrace. Default: 8. */
299extern Int VG_(clo_backtrace_size);
sewardj3984b852002-05-12 03:00:17 +0000300/* Engage miscellaneous wierd hacks needed for some progs. */
sewardj8d365b52002-05-12 10:52:16 +0000301extern Char* VG_(clo_weird_hacks);
sewardjde4a1d02002-03-22 01:27:54 +0000302
303
304/* ---------------------------------------------------------------------
305 Debugging and profiling stuff
306 ------------------------------------------------------------------ */
307
308/* No, really. I _am_ that strange. */
309#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
310
311/* Tools for building messages from multiple parts. */
312typedef
313 enum { Vg_UserMsg, Vg_DebugMsg, Vg_DebugExtraMsg }
314 VgMsgKind;
315
316extern void VG_(start_msg) ( VgMsgKind kind );
317extern void VG_(add_to_msg) ( Char* format, ... );
318extern void VG_(end_msg) ( void );
319
320/* Send a simple, single-part message. */
321extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
322
323/* Create a logfile into which messages can be dumped. */
324extern void VG_(startup_logging) ( void );
325extern void VG_(shutdown_logging) ( void );
326
327
328/* Profiling stuff */
329#ifdef VG_PROFILE
330
331#define VGP_M_STACK 10
332
sewardj671ff542002-05-07 09:25:30 +0000333#define VGP_M_CCS 26 /* == the # of elems in VGP_LIST */
sewardjde4a1d02002-03-22 01:27:54 +0000334#define VGP_LIST \
sewardj671ff542002-05-07 09:25:30 +0000335 VGP_PAIR(VgpUnc=0, "unclassified"), \
336 VGP_PAIR(VgpRun, "running"), \
337 VGP_PAIR(VgpSched, "scheduler"), \
sewardjde4a1d02002-03-22 01:27:54 +0000338 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
339 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
340 VGP_PAIR(VgpTranslate, "translate-main"), \
341 VGP_PAIR(VgpToUCode, "to-ucode"), \
342 VGP_PAIR(VgpFromUcode, "from-ucode"), \
343 VGP_PAIR(VgpImprove, "improve"), \
344 VGP_PAIR(VgpInstrument, "instrument"), \
345 VGP_PAIR(VgpCleanup, "cleanup"), \
346 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
347 VGP_PAIR(VgpDoLRU, "do-lru"), \
348 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
349 VGP_PAIR(VgpInitAudit, "init-mem-audit"), \
350 VGP_PAIR(VgpExeContext, "exe-context"), \
351 VGP_PAIR(VgpReadSyms, "read-syms"), \
352 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
353 VGP_PAIR(VgpSARP, "set-addr-range-perms"), \
354 VGP_PAIR(VgpSyscall, "syscall wrapper"), \
njn4f9c9342002-04-29 16:03:24 +0000355 VGP_PAIR(VgpCacheInstrument, "cache instrument"), \
356 VGP_PAIR(VgpCacheGetBBCC,"cache get BBCC"), \
357 VGP_PAIR(VgpCacheSimulate, "cache simulate"), \
358 VGP_PAIR(VgpCacheDump, "cache stats dump"), \
sewardjde4a1d02002-03-22 01:27:54 +0000359 VGP_PAIR(VgpSpare1, "spare 1"), \
360 VGP_PAIR(VgpSpare2, "spare 2")
361
362#define VGP_PAIR(enumname,str) enumname
363typedef enum { VGP_LIST } VgpCC;
364#undef VGP_PAIR
365
366extern void VGP_(init_profiling) ( void );
367extern void VGP_(done_profiling) ( void );
368extern void VGP_(pushcc) ( VgpCC );
369extern void VGP_(popcc) ( void );
370
371#define VGP_PUSHCC(cc) VGP_(pushcc)(cc)
372#define VGP_POPCC VGP_(popcc)()
373
374#else
375
376#define VGP_PUSHCC(cc) /* */
377#define VGP_POPCC /* */
378
379#endif /* VG_PROFILE */
380
381
382/* ---------------------------------------------------------------------
383 Exports of vg_malloc2.c
384 ------------------------------------------------------------------ */
385
386/* Allocation arenas.
387 SYMTAB is for Valgrind's symbol table storage.
388 CLIENT is for the client's mallocs/frees.
389 DEMANGLE is for the C++ demangler.
390 EXECTXT is for storing ExeContexts.
391 ERRCTXT is for storing ErrContexts.
392 PRIVATE is for Valgrind general stuff.
393 TRANSIENT is for very short-term use. It should be empty
394 in between uses.
395 When adding a new arena, remember also to add it
396 to ensure_mm_init().
397*/
398typedef Int ArenaId;
399
400#define VG_N_ARENAS 7
401
402#define VG_AR_PRIVATE 0 /* :: ArenaId */
403#define VG_AR_SYMTAB 1 /* :: ArenaId */
404#define VG_AR_CLIENT 2 /* :: ArenaId */
405#define VG_AR_DEMANGLE 3 /* :: ArenaId */
406#define VG_AR_EXECTXT 4 /* :: ArenaId */
407#define VG_AR_ERRCTXT 5 /* :: ArenaId */
408#define VG_AR_TRANSIENT 6 /* :: ArenaId */
409
410extern void* VG_(malloc) ( ArenaId arena, Int nbytes );
411extern void VG_(free) ( ArenaId arena, void* ptr );
412extern void* VG_(calloc) ( ArenaId arena, Int nmemb, Int nbytes );
413extern void* VG_(realloc) ( ArenaId arena, void* ptr, Int size );
414extern void* VG_(malloc_aligned) ( ArenaId aid, Int req_alignB,
415 Int req_pszB );
416
417extern void VG_(mallocSanityCheckArena) ( ArenaId arena );
418extern void VG_(mallocSanityCheckAll) ( void );
419
420extern void VG_(show_all_arena_stats) ( void );
421extern Bool VG_(is_empty_arena) ( ArenaId aid );
422
423
424/* The red-zone size for the client. This can be arbitrary, but
425 unfortunately must be set at compile time. */
426#define VG_AR_CLIENT_REDZONE_SZW 4
427
428#define VG_AR_CLIENT_REDZONE_SZB \
429 (VG_AR_CLIENT_REDZONE_SZW * VKI_BYTES_PER_WORD)
430
431
432/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000433 Exports of vg_clientfuns.c
434 ------------------------------------------------------------------ */
435
436/* This doesn't export code or data that valgrind.so needs to link
437 against. However, the scheduler does need to know the following
438 request codes. A few, publically-visible, request codes are also
439 defined in valgrind.h. */
440
441#define VG_USERREQ__MALLOC 0x2001
442#define VG_USERREQ__BUILTIN_NEW 0x2002
443#define VG_USERREQ__BUILTIN_VEC_NEW 0x2003
444
445#define VG_USERREQ__FREE 0x2004
446#define VG_USERREQ__BUILTIN_DELETE 0x2005
447#define VG_USERREQ__BUILTIN_VEC_DELETE 0x2006
448
449#define VG_USERREQ__CALLOC 0x2007
450#define VG_USERREQ__REALLOC 0x2008
451#define VG_USERREQ__MEMALIGN 0x2009
452
453
sewardj20917d82002-05-28 01:36:45 +0000454/* (Fn, Arg): Create a new thread and run Fn applied to Arg in it. Fn
455 MUST NOT return -- ever. Eventually it will do either __QUIT or
456 __WAIT_JOINER. */
457#define VG_USERREQ__APPLY_IN_NEW_THREAD 0x3001
458
459/* ( no-args ): calling thread disappears from the system forever.
460 Reclaim resources. */
461#define VG_USERREQ__QUIT 0x3002
462
463/* ( void* ): calling thread waits for joiner and returns the void* to
464 it. */
465#define VG_USERREQ__WAIT_JOINER 0x3003
466
467/* ( ThreadId, void** ): wait to join a thread. */
468#define VG_USERREQ__PTHREAD_JOIN 0x3004
469
470/* Set cancellation state and type for this thread. */
471#define VG_USERREQ__SET_CANCELSTATE 0x3005
472#define VG_USERREQ__SET_CANCELTYPE 0x3006
473
474/* ( no-args ): Test if we are at a cancellation point. */
475#define VG_USERREQ__TESTCANCEL 0x3007
476
477/* ( ThreadId, &thread_exit_wrapper is the only allowable arg ): call
478 with this arg to indicate that a cancel is now pending for the
479 specified thread. */
480#define VG_USERREQ__SET_CANCELPEND 0x3008
481
482/* Set/get detach state for this thread. */
483#define VG_USERREQ__SET_OR_GET_DETACH 0x3009
484
485#define VG_USERREQ__PTHREAD_GET_THREADID 0x300B
486#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x300C
487#define VG_USERREQ__PTHREAD_MUTEX_TRYLOCK 0x300D
488#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x300E
489#define VG_USERREQ__PTHREAD_COND_WAIT 0x300F
490#define VG_USERREQ__PTHREAD_COND_TIMEDWAIT 0x3010
491#define VG_USERREQ__PTHREAD_COND_SIGNAL 0x3011
492#define VG_USERREQ__PTHREAD_COND_BROADCAST 0x3012
493#define VG_USERREQ__PTHREAD_KEY_CREATE 0x3013
494#define VG_USERREQ__PTHREAD_KEY_DELETE 0x3014
495#define VG_USERREQ__PTHREAD_SETSPECIFIC 0x3015
496#define VG_USERREQ__PTHREAD_GETSPECIFIC 0x3016
497#define VG_USERREQ__READ_MILLISECOND_TIMER 0x3017
498#define VG_USERREQ__PTHREAD_SIGMASK 0x3018
499#define VG_USERREQ__SIGWAIT 0x3019
500#define VG_USERREQ__PTHREAD_KILL 0x301A
501#define VG_USERREQ__PTHREAD_YIELD 0x301B
sewardj2e93c502002-04-12 11:12:52 +0000502
sewardj8ad94e12002-05-29 00:10:20 +0000503#define VG_USERREQ__CLEANUP_PUSH 0x3020
504#define VG_USERREQ__CLEANUP_POP 0x3021
sewardj870497a2002-05-29 01:06:47 +0000505#define VG_USERREQ__GET_KEY_D_AND_S 0x3022
sewardj8ad94e12002-05-29 00:10:20 +0000506
sewardjef037c72002-05-30 00:40:03 +0000507#define VG_USERREQ__NUKE_OTHER_THREADS 0x3023
508
sewardj4dced352002-06-04 22:54:20 +0000509
sewardj45b4b372002-04-16 22:50:32 +0000510/* Cosmetic ... */
511#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
sewardj4dced352002-06-04 22:54:20 +0000512/* Log a pthread error from client-space. Cosmetic. */
513#define VG_USERREQ__PTHREAD_ERROR 0x3102
sewardj45b4b372002-04-16 22:50:32 +0000514
sewardj54cacf02002-04-12 23:24:59 +0000515/*
516In vg_constants.h:
517#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardj54cacf02002-04-12 23:24:59 +0000518*/
519
520
sewardj2e93c502002-04-12 11:12:52 +0000521/* ---------------------------------------------------------------------
522 Constants pertaining to the simulated CPU state, VG_(baseBlock),
523 which need to go here to avoid ugly circularities.
524 ------------------------------------------------------------------ */
525
526/* How big is the saved FPU state? */
527#define VG_SIZE_OF_FPUSTATE 108
528/* ... and in words ... */
529#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
530
531
532/* ---------------------------------------------------------------------
533 Exports of vg_scheduler.c
534 ------------------------------------------------------------------ */
535
536/* ThreadIds are simply indices into the vg_threads[] array. */
537typedef
538 UInt
539 ThreadId;
540
sewardj6072c362002-04-19 14:40:57 +0000541/* Special magic value for an invalid ThreadId. It corresponds to
542 LinuxThreads using zero as the initial value for
543 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
544#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000545
546typedef
547 enum {
548 VgTs_Empty, /* this slot is not in use */
549 VgTs_Runnable, /* waiting to be scheduled */
550 VgTs_WaitJoiner, /* waiting for someone to do join on me */
551 VgTs_WaitJoinee, /* waiting for the thread I did join on */
552 VgTs_WaitFD, /* waiting for I/O completion on a fd */
553 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000554 VgTs_WaitCV, /* waiting on a condition variable */
sewardjb48e5002002-05-13 00:16:03 +0000555 VgTs_WaitSIG, /* waiting due to sigwait() */
sewardj2e93c502002-04-12 11:12:52 +0000556 VgTs_Sleeping /* sleeping for a while */
557 }
558 ThreadStatus;
sewardj8ad94e12002-05-29 00:10:20 +0000559
560/* An entry in a threads's cleanup stack. */
561typedef
562 struct {
563 void (*fn)(void*);
564 void* arg;
565 }
566 CleanupEntry;
sewardj2e93c502002-04-12 11:12:52 +0000567
568typedef
569 struct {
sewardj6072c362002-04-19 14:40:57 +0000570 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
571 The thread identity is simply the index in vg_threads[].
572 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000573 that we don't try and allocate or deallocate its stack. For
574 convenience of generating error message, we also put the
575 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000576 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000577 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000578
sewardj5f07b662002-04-23 16:52:51 +0000579 /* Current scheduling status.
580
581 Complications: whenever this is set to VgTs_WaitMX, you
582 should also set .m_edx to whatever the required return value
583 is for pthread_mutex_lock / pthread_cond_timedwait for when
584 the mutex finally gets unblocked. */
sewardj2e93c502002-04-12 11:12:52 +0000585 ThreadStatus status;
586
sewardj3b5d8862002-04-20 13:53:23 +0000587 /* When .status == WaitMX, points to the mutex I am waiting for.
588 When .status == WaitCV, points to the mutex associated with
589 the condition variable indicated by the .associated_cv field.
590 In all other cases, should be NULL. */
591 void* /* pthread_mutex_t* */ associated_mx;
592
593 /* When .status == WaitCV, points to the condition variable I am
594 waiting for. In all other cases, should be NULL. */
595 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000596
sewardj5f07b662002-04-23 16:52:51 +0000597 /* If VgTs_Sleeping, this is when we should wake up, measured in
598 milliseconds as supplied by VG_(read_millisecond_counter).
599
600 If VgTs_WaitCV, this indicates the time at which
601 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
602 this means infinitely far in the future, viz,
603 pthread_cond_wait. */
604 UInt awaken_at;
sewardj2e93c502002-04-12 11:12:52 +0000605
sewardj20917d82002-05-28 01:36:45 +0000606 /* If VgTs_WaitJoiner, return value, as generated by joinees. */
607 void* joinee_retval;
608
609 /* If VgTs_WaitJoinee, place to copy the return value to, and
610 the identity of the thread we're waiting for. */
611 void** joiner_thread_return;
612 ThreadId joiner_jee_tid;
613
sewardj8ad94e12002-05-29 00:10:20 +0000614 /* Whether or not detached. */
615 Bool detached;
616
sewardj20917d82002-05-28 01:36:45 +0000617 /* Cancelability state and type. */
618 Bool cancel_st; /* False==PTH_CANCEL_DISABLE; True==.._ENABLE */
619 Bool cancel_ty; /* False==PTH_CANC_ASYNCH; True==..._DEFERRED */
620
621 /* Pointer to fn to call to do cancellation. Indicates whether
622 or not cancellation is pending. If NULL, not pending. Else
623 should be &thread_exit_wrapper(), indicating that
624 cancallation is pending. */
625 void (*cancel_pend)(void*);
626
sewardj8ad94e12002-05-29 00:10:20 +0000627 /* The cleanup stack. */
628 Int custack_used;
629 CleanupEntry custack[VG_N_CLEANUPSTACK];
sewardj2e93c502002-04-12 11:12:52 +0000630
sewardj5f07b662002-04-23 16:52:51 +0000631 /* thread-specific data */
632 void* specifics[VG_N_THREAD_KEYS];
633
sewardjb48e5002002-05-13 00:16:03 +0000634 /* This thread's blocked-signals mask. Semantics is that for a
635 signal to be delivered to this thread, the signal must not be
636 blocked by either the process-wide signal mask nor by this
637 one. So, if this thread is prepared to handle any signal that
638 the process as a whole is prepared to handle, this mask should
639 be made empty -- and that it is its default, starting
640 state. */
641 vki_ksigset_t sig_mask;
642
643 /* When not VgTs_WaitSIG, has no meaning. When VgTs_WaitSIG,
644 is the set of signals for which we are sigwait()ing. */
645 vki_ksigset_t sigs_waited_for;
646
sewardj2e93c502002-04-12 11:12:52 +0000647 /* Stacks. When a thread slot is freed, we don't deallocate its
648 stack; we just leave it lying around for the next use of the
649 slot. If the next use of the slot requires a larger stack,
650 only then is the old one deallocated and a new one
651 allocated.
652
653 For the main thread (threadid == 0), this mechanism doesn't
654 apply. We don't know the size of the stack since we didn't
655 allocate it, and furthermore we never reallocate it. */
656
657 /* The allocated size of this thread's stack (permanently zero
658 if this is ThreadId == 0, since we didn't allocate its stack) */
659 UInt stack_size;
660
661 /* Address of the lowest word in this thread's stack. NULL means
662 not allocated yet.
663 */
664 Addr stack_base;
665
sewardj1e8cdc92002-04-18 11:37:52 +0000666 /* Address of the highest legitimate word in this stack. This is
667 used for error messages only -- not critical for execution
668 correctness. Is is set for all stacks, specifically including
669 ThreadId == 0 (the main thread). */
670 Addr stack_highest_word;
671
sewardj2e93c502002-04-12 11:12:52 +0000672 /* Saved machine context. */
673 UInt m_eax;
674 UInt m_ebx;
675 UInt m_ecx;
676 UInt m_edx;
677 UInt m_esi;
678 UInt m_edi;
679 UInt m_ebp;
680 UInt m_esp;
681 UInt m_eflags;
682 UInt m_eip;
683 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
684
685 UInt sh_eax;
686 UInt sh_ebx;
687 UInt sh_ecx;
688 UInt sh_edx;
689 UInt sh_esi;
690 UInt sh_edi;
691 UInt sh_ebp;
692 UInt sh_esp;
693 UInt sh_eflags;
694 }
695 ThreadState;
696
697
sewardj018f7622002-05-15 21:13:39 +0000698/* The thread table. */
699extern ThreadState VG_(threads)[VG_N_THREADS];
700
701/* Check that tid is in range and denotes a non-Empty thread. */
sewardjb48e5002002-05-13 00:16:03 +0000702extern Bool VG_(is_valid_tid) ( ThreadId tid );
703
sewardj018f7622002-05-15 21:13:39 +0000704/* Check that tid is in range. */
705extern Bool VG_(is_valid_or_empty_tid) ( ThreadId tid );
706
sewardj2e93c502002-04-12 11:12:52 +0000707/* Copy the specified thread's state into VG_(baseBlock) in
708 preparation for running it. */
709extern void VG_(load_thread_state)( ThreadId );
710
711/* Save the specified thread's state back in VG_(baseBlock), and fill
712 VG_(baseBlock) with junk, for sanity-check reasons. */
713extern void VG_(save_thread_state)( ThreadId );
714
sewardj1e8cdc92002-04-18 11:37:52 +0000715/* And for the currently running one, if valid. */
716extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000717
sewardj1e8cdc92002-04-18 11:37:52 +0000718/* Similarly ... */
719extern ThreadId VG_(get_current_tid) ( void );
720
721/* Which thread is this address in the stack of, if any? Used for
722 error message generation. */
723extern ThreadId VG_(identify_stack_addr)( Addr a );
724
sewardjccef2e62002-05-29 19:26:32 +0000725/* Nuke all threads except tid. */
726extern void VG_(nuke_all_threads_except) ( ThreadId me );
727
sewardj2e93c502002-04-12 11:12:52 +0000728
729/* Return codes from the scheduler. */
730typedef
sewardj7e87e382002-05-03 19:09:05 +0000731 enum {
732 VgSrc_Deadlock, /* no runnable threads and no prospect of any
733 even if we wait for a long time */
734 VgSrc_ExitSyscall, /* client called exit(). This is the normal
735 route out. */
736 VgSrc_BbsDone /* In a debugging run, the specified number of
737 bbs has been completed. */
738 }
sewardj2e93c502002-04-12 11:12:52 +0000739 VgSchedReturnCode;
740
sewardj7e87e382002-05-03 19:09:05 +0000741
sewardj2e93c502002-04-12 11:12:52 +0000742/* The scheduler. */
743extern VgSchedReturnCode VG_(scheduler) ( void );
744
745extern void VG_(scheduler_init) ( void );
746
sewardj15a43e12002-04-17 19:35:12 +0000747extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000748
749/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
750extern jmp_buf VG_(scheduler_jmpbuf);
751/* ... and if so, here's the signal which caused it to do so. */
752extern Int VG_(longjmpd_on_signal);
753
754
sewardja1679dd2002-05-10 22:31:40 +0000755/* Possible places where the main stack might be based. We check that
756 the initial stack, which we can't move, is allocated here.
757 VG_(scheduler_init) checks this. Andrea Archelangi's 2.4 kernels
758 have been rumoured to start stacks at 0x80000000, so that too is
759 considered.
sewardj2e93c502002-04-12 11:12:52 +0000760*/
sewardja1679dd2002-05-10 22:31:40 +0000761#define VG_STARTUP_STACK_BASE_1 (Addr)0xC0000000
762#define VG_STARTUP_STACK_BASE_2 (Addr)0x80000000
763#define VG_STARTUP_STACK_SMALLERTHAN 0x100000 /* 1024k */
764
765#define VG_STACK_MATCHES_BASE(zzstack, zzbase) \
766 ( \
767 ((zzstack) & ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN)) \
768 == \
769 ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN) \
770 )
sewardj2e93c502002-04-12 11:12:52 +0000771
772
773/* The red-zone size which we put at the bottom (highest address) of
774 thread stacks, for paranoia reasons. This can be arbitrary, and
775 doesn't really need to be set at compile time. */
776#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
777
778#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
779 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
780
781
sewardj018f7622002-05-15 21:13:39 +0000782/* Write a value to the client's %EDX (request return value register)
783 and set the shadow to indicate it is defined. */
784#define SET_EDX(zztid, zzval) \
785 do { VG_(threads)[zztid].m_edx = (zzval); \
786 VG_(threads)[zztid].sh_edx = VGM_WORD_VALID; \
787 } while (0)
788
789#define SET_EAX(zztid, zzval) \
790 do { VG_(threads)[zztid].m_eax = (zzval); \
791 VG_(threads)[zztid].sh_eax = VGM_WORD_VALID; \
792 } while (0)
793
sewardj2e93c502002-04-12 11:12:52 +0000794
795/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000796 Exports of vg_signals.c
797 ------------------------------------------------------------------ */
798
sewardjde4a1d02002-03-22 01:27:54 +0000799extern void VG_(sigstartup_actions) ( void );
800
sewardjb48e5002002-05-13 00:16:03 +0000801extern Bool VG_(deliver_signals) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000802extern void VG_(unblock_host_signal) ( Int sigNo );
sewardj018f7622002-05-15 21:13:39 +0000803extern void VG_(handle_SCSS_change) ( Bool force_update );
804
sewardjde4a1d02002-03-22 01:27:54 +0000805
806/* Fake system calls for signal handling. */
sewardj2342c972002-05-22 23:34:20 +0000807extern void VG_(do__NR_sigaltstack) ( ThreadId tid );
sewardj2e93c502002-04-12 11:12:52 +0000808extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardj018f7622002-05-15 21:13:39 +0000809extern void VG_(do__NR_sigprocmask) ( ThreadId tid,
810 Int how,
811 vki_ksigset_t* set,
812 vki_ksigset_t* oldset );
813extern void VG_(do_pthread_sigmask_SCSS_upd) ( ThreadId tid,
814 Int how,
815 vki_ksigset_t* set,
816 vki_ksigset_t* oldset );
817extern void VG_(send_signal_to_thread) ( ThreadId thread,
818 Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000819
sewardj2e93c502002-04-12 11:12:52 +0000820/* Modify the current thread's state once we have detected it is
821 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000822extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000823
sewardj2e93c502002-04-12 11:12:52 +0000824/* Handy utilities to block/restore all host signals. */
825extern void VG_(block_all_host_signals)
826 ( /* OUT */ vki_ksigset_t* saved_mask );
sewardj018f7622002-05-15 21:13:39 +0000827extern void VG_(restore_all_host_signals)
sewardj2e93c502002-04-12 11:12:52 +0000828 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000829
830/* ---------------------------------------------------------------------
831 Exports of vg_mylibc.c
832 ------------------------------------------------------------------ */
833
834
sewardjfbe18b92002-05-10 00:46:59 +0000835#if !defined(NULL)
836# define NULL ((void*)0)
837#endif
sewardjde4a1d02002-03-22 01:27:54 +0000838
839extern void VG_(exit)( Int status )
840 __attribute__ ((__noreturn__));
841
842extern void VG_(printf) ( const char *format, ... );
843/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
844
845extern void VG_(sprintf) ( Char* buf, Char *format, ... );
846
847extern void VG_(vprintf) ( void(*send)(Char),
848 const Char *format, va_list vargs );
849
850extern Bool VG_(isspace) ( Char c );
njn7cf0bd32002-06-08 13:36:03 +0000851extern Bool VG_(isdigit) ( Char c );
sewardjde4a1d02002-03-22 01:27:54 +0000852
853extern Int VG_(strlen) ( const Char* str );
854
855extern Long VG_(atoll) ( Char* str );
sewardja70ca3f2002-05-30 01:22:20 +0000856extern Long VG_(atoll36) ( Char* str );
sewardjde4a1d02002-03-22 01:27:54 +0000857
858extern Char* VG_(strcat) ( Char* dest, const Char* src );
859extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
860extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
861
862extern Char* VG_(strcpy) ( Char* dest, const Char* src );
863
864extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
865extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
866
867extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
868extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
869
870extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
871extern Char* VG_(strchr) ( const Char* s, Char c );
872extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
873
874extern Char* VG_(getenv) ( Char* name );
875extern Int VG_(getpid) ( void );
sewardj5f07b662002-04-23 16:52:51 +0000876
877extern void VG_(start_rdtsc_calibration) ( void );
878extern void VG_(end_rdtsc_calibration) ( void );
879extern UInt VG_(read_millisecond_timer) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000880
881
882extern Char VG_(toupper) ( Char c );
883
884extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
885
886extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
887
888extern Bool VG_(stringMatch) ( Char* pat, Char* str );
889
890
sewardj3e1eb1f2002-05-18 13:14:17 +0000891#define VG__STRING(__str) #__str
sewardjde4a1d02002-03-22 01:27:54 +0000892
893/* Asserts are permanently enabled. Hurrah! */
894#define vg_assert(expr) \
895 ((void) ((expr) ? 0 : \
sewardj3e1eb1f2002-05-18 13:14:17 +0000896 (VG_(assert_fail) (VG__STRING(expr), \
sewardjde4a1d02002-03-22 01:27:54 +0000897 __FILE__, __LINE__, \
898 __PRETTY_FUNCTION__), 0)))
899
900extern void VG_(assert_fail) ( Char* expr, Char* file,
901 Int line, Char* fn )
902 __attribute__ ((__noreturn__));
903
njn4f9c9342002-04-29 16:03:24 +0000904/* Reading and writing files. */
sewardjde4a1d02002-03-22 01:27:54 +0000905extern Int VG_(open_read) ( Char* pathname );
njn4f9c9342002-04-29 16:03:24 +0000906extern Int VG_(open_write) ( Char* pathname );
907extern Int VG_(create_and_write) ( Char* pathname );
sewardjde4a1d02002-03-22 01:27:54 +0000908extern void VG_(close) ( Int fd );
909extern Int VG_(read) ( Int fd, void* buf, Int count);
910extern Int VG_(write) ( Int fd, void* buf, Int count);
sewardjb3586202002-05-09 17:38:13 +0000911extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
sewardjde4a1d02002-03-22 01:27:54 +0000912
sewardj2e93c502002-04-12 11:12:52 +0000913extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
914
915extern Int VG_(select)( Int n,
916 vki_fd_set* readfds,
917 vki_fd_set* writefds,
918 vki_fd_set* exceptfds,
919 struct vki_timeval * timeout );
920extern Int VG_(nanosleep)( const struct vki_timespec *req,
921 struct vki_timespec *rem );
922
923
sewardjde4a1d02002-03-22 01:27:54 +0000924/* mmap-ery ... */
925extern void* VG_(mmap)( void* start, UInt length,
926 UInt prot, UInt flags, UInt fd, UInt offset );
927
sewardj2e93c502002-04-12 11:12:52 +0000928extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000929
sewardjb3586202002-05-09 17:38:13 +0000930extern void* VG_(brk) ( void* end_data_segment );
931
sewardjde4a1d02002-03-22 01:27:54 +0000932
933/* Print a (panic) message, and abort. */
934extern void VG_(panic) ( Char* str )
935 __attribute__ ((__noreturn__));
936
937/* Get memory by anonymous mmap. */
sewardje9047952002-06-05 20:28:33 +0000938extern void* VG_(get_memory_from_mmap) ( Int nBytes, Char* who );
sewardje6a25242002-04-21 22:03:07 +0000939
940/* Crude stand-in for the glibc system() call. */
941extern Int VG_(system) ( Char* cmd );
942
sewardjde4a1d02002-03-22 01:27:54 +0000943
944/* Signal stuff. Note that these use the vk_ (kernel) structure
945 definitions, which are different in places from those that glibc
946 defines. Since we're operating right at the kernel interface,
947 glibc's view of the world is entirely irrelevant. */
sewardj018f7622002-05-15 21:13:39 +0000948
949/* --- Signal set ops --- */
sewardjb48e5002002-05-13 00:16:03 +0000950extern Int VG_(ksigfillset)( vki_ksigset_t* set );
951extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
sewardjde4a1d02002-03-22 01:27:54 +0000952
sewardj018f7622002-05-15 21:13:39 +0000953extern Bool VG_(kisfullsigset)( vki_ksigset_t* set );
954extern Bool VG_(kisemptysigset)( vki_ksigset_t* set );
955
956extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
957extern Int VG_(ksigdelset)( vki_ksigset_t* set, Int signum );
958extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
959
sewardjb48e5002002-05-13 00:16:03 +0000960extern void VG_(ksigaddset_from_set)( vki_ksigset_t* dst,
961 vki_ksigset_t* src );
962extern void VG_(ksigdelset_from_set)( vki_ksigset_t* dst,
963 vki_ksigset_t* src );
964
sewardj018f7622002-05-15 21:13:39 +0000965/* --- Mess with the kernel's sig state --- */
966extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
967 vki_ksigset_t* oldset );
968extern Int VG_(ksigaction) ( Int signum,
969 const vki_ksigaction* act,
970 vki_ksigaction* oldact );
sewardjde4a1d02002-03-22 01:27:54 +0000971
972extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
973
974extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
975
sewardj018f7622002-05-15 21:13:39 +0000976extern Int VG_(kill)( Int pid, Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000977
978
979/* ---------------------------------------------------------------------
980 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
981 vg_from_ucode.c).
982 ------------------------------------------------------------------ */
983
984/* Tags which describe what operands are. */
985typedef
986 enum { TempReg=0, ArchReg=1, RealReg=2,
987 SpillNo=3, Literal=4, Lit16=5,
988 NoValue=6 }
989 Tag;
990
991
992/* Microinstruction opcodes. */
993typedef
994 enum {
995 NOP,
996 GET,
997 PUT,
998 LOAD,
999 STORE,
1000 MOV,
1001 CMOV, /* Used for cmpxchg and cmov */
1002 WIDEN,
1003 JMP,
1004
1005 /* Read/write the %EFLAGS register into a TempReg. */
1006 GETF, PUTF,
1007
1008 ADD, ADC, AND, OR, XOR, SUB, SBB,
1009 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
1010 NOT, NEG, INC, DEC, BSWAP,
1011 CC2VAL,
1012
1013 /* Not strictly needed, but useful for making better
1014 translations of address calculations. */
1015 LEA1, /* reg2 := const + reg1 */
1016 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
1017
1018 /* not for translating x86 calls -- only to call helpers */
1019 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
1020 for CALLM. */
1021 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
1022 CALLM, /* call to a machine-code helper */
1023
1024 /* Hack for translating string (REP-) insns. Jump to literal if
1025 TempReg/RealReg is zero. */
1026 JIFZ,
1027
1028 /* FPU ops which read/write mem or don't touch mem at all. */
1029 FPU_R,
1030 FPU_W,
1031 FPU,
1032
1033 /* Advance the simulated %eip by some small (< 128) number. */
1034 INCEIP,
1035
1036 /* uinstrs which are not needed for mere translation of x86 code,
1037 only for instrumentation of it. */
1038 LOADV,
1039 STOREV,
1040 GETV,
1041 PUTV,
1042 TESTV,
1043 SETV,
1044 /* Get/set the v-bit (and it is only one bit) for the simulated
1045 %eflags register. */
1046 GETVF,
1047 PUTVF,
1048
1049 /* Do a unary or binary tag op. Only for post-instrumented
1050 code. For TAG1, first and only arg is a TempReg, and is both
1051 arg and result reg. For TAG2, first arg is src, second is
1052 dst, in the normal way; both are TempRegs. In both cases,
1053 3rd arg is a RiCHelper with a Lit16 tag. This indicates
1054 which tag op to do. */
1055 TAG1,
1056 TAG2
1057 }
1058 Opcode;
1059
1060
1061/* Condition codes, observing the Intel encoding. CondAlways is an
1062 extra. */
1063typedef
1064 enum {
1065 CondO = 0, /* overflow */
1066 CondNO = 1, /* no overflow */
1067 CondB = 2, /* below */
1068 CondNB = 3, /* not below */
1069 CondZ = 4, /* zero */
1070 CondNZ = 5, /* not zero */
1071 CondBE = 6, /* below or equal */
1072 CondNBE = 7, /* not below or equal */
1073 CondS = 8, /* negative */
1074 ConsNS = 9, /* not negative */
1075 CondP = 10, /* parity even */
1076 CondNP = 11, /* not parity even */
1077 CondL = 12, /* jump less */
1078 CondNL = 13, /* not less */
1079 CondLE = 14, /* less or equal */
1080 CondNLE = 15, /* not less or equal */
1081 CondAlways = 16 /* Jump always */
1082 }
1083 Condcode;
1084
1085
sewardj2e93c502002-04-12 11:12:52 +00001086/* Descriptions of additional properties of *unconditional* jumps. */
1087typedef
1088 enum {
1089 JmpBoring=0, /* boring unconditional jump */
1090 JmpCall=1, /* jump due to an x86 call insn */
1091 JmpRet=2, /* jump due to an x86 ret insn */
1092 JmpSyscall=3, /* do a system call, then jump */
1093 JmpClientReq=4 /* do a client request, then jump */
1094 }
1095 JmpKind;
1096
1097
sewardjde4a1d02002-03-22 01:27:54 +00001098/* Flags. User-level code can only read/write O(verflow), S(ign),
1099 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
1100 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
1101 thusly:
1102 76543210
1103 DOSZACP
1104 and bit 7 must always be zero since it is unused.
1105*/
1106typedef UChar FlagSet;
1107
1108#define FlagD (1<<6)
1109#define FlagO (1<<5)
1110#define FlagS (1<<4)
1111#define FlagZ (1<<3)
1112#define FlagA (1<<2)
1113#define FlagC (1<<1)
1114#define FlagP (1<<0)
1115
1116#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
1117#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
1118#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
1119#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
1120#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
1121#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +00001122#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +00001123#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +00001124#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +00001125
1126#define FlagsALL (FlagsOSZACP | FlagD)
1127#define FlagsEmpty (FlagSet)0
1128
1129#define VG_IS_FLAG_SUBSET(set1,set2) \
1130 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
1131
1132#define VG_UNION_FLAG_SETS(set1,set2) \
1133 ( ((FlagSet)set1) | ((FlagSet)set2) )
1134
1135
1136
1137/* A Micro (u)-instruction. */
1138typedef
1139 struct {
1140 /* word 1 */
1141 UInt lit32; /* 32-bit literal */
1142
1143 /* word 2 */
1144 UShort val1; /* first operand */
1145 UShort val2; /* second operand */
1146
1147 /* word 3 */
1148 UShort val3; /* third operand */
1149 UChar opcode; /* opcode */
1150 UChar size; /* data transfer size */
1151
1152 /* word 4 */
1153 FlagSet flags_r; /* :: FlagSet */
1154 FlagSet flags_w; /* :: FlagSet */
1155 UChar tag1:4; /* first operand tag */
1156 UChar tag2:4; /* second operand tag */
1157 UChar tag3:4; /* third operand tag */
1158 UChar extra4b:4; /* Spare field, used by WIDEN for src
1159 -size, and by LEA2 for scale
njn4f9c9342002-04-29 16:03:24 +00001160 (1,2,4 or 8), and by unconditional JMPs for
1161 orig x86 instr size if --cachesim=yes */
1162
sewardjde4a1d02002-03-22 01:27:54 +00001163
1164 /* word 5 */
1165 UChar cond; /* condition, for jumps */
1166 Bool smc_check:1; /* do a smc test, if writes memory. */
1167 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +00001168 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +00001169 }
1170 UInstr;
1171
1172
1173/* Expandable arrays of uinstrs. */
1174typedef
1175 struct {
1176 Int used;
1177 Int size;
1178 UInstr* instrs;
1179 Int nextTemp;
1180 }
1181 UCodeBlock;
1182
1183/* Refer to `the last instruction stuffed in', including as an
1184 lvalue. */
1185#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1186
1187/* An invalid temporary number :-) */
1188#define INVALID_TEMPREG 999999999
1189
1190
1191/* ---------------------------------------------------------------------
1192 Exports of vg_demangle.c
1193 ------------------------------------------------------------------ */
1194
1195extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
1196
1197
1198/* ---------------------------------------------------------------------
1199 Exports of vg_from_ucode.c
1200 ------------------------------------------------------------------ */
1201
1202extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
1203
1204
1205/* ---------------------------------------------------------------------
1206 Exports of vg_to_ucode.c
1207 ------------------------------------------------------------------ */
1208
1209extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
1210extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
1211extern Char VG_(nameOfIntSize) ( Int size );
1212extern UInt VG_(extend_s_8to32) ( UInt x );
1213extern Int VG_(getNewTemp) ( UCodeBlock* cb );
1214extern Int VG_(getNewShadow) ( UCodeBlock* cb );
1215
1216#define SHADOW(tempreg) ((tempreg)+1)
1217
1218
1219/* ---------------------------------------------------------------------
1220 Exports of vg_translate.c
1221 ------------------------------------------------------------------ */
1222
sewardj1e8cdc92002-04-18 11:37:52 +00001223extern void VG_(translate) ( ThreadState* tst,
1224 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001225 UInt* orig_size,
1226 Addr* trans_addr,
1227 UInt* trans_size );
1228
1229extern void VG_(emptyUInstr) ( UInstr* u );
1230extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1231extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
1232 Tag tag1, UInt val1 );
1233extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
1234 Tag tag1, UInt val1,
1235 Tag tag2, UInt val2 );
1236extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
1237 Tag tag1, UInt val1,
1238 Tag tag2, UInt val2,
1239 Tag tag3, UInt val3 );
1240extern void VG_(setFlagRW) ( UInstr* u,
1241 FlagSet fr, FlagSet fw );
1242
1243extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1244extern Bool VG_(anyFlagUse) ( UInstr* u );
1245
1246
1247
1248extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1249extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1250
njn4f9c9342002-04-29 16:03:24 +00001251extern UCodeBlock* VG_(allocCodeBlock) ( void );
1252extern void VG_(freeCodeBlock) ( UCodeBlock* cb );
1253extern void VG_(copyUInstr) ( UCodeBlock* cb, UInstr* instr );
1254
sewardjde4a1d02002-03-22 01:27:54 +00001255extern Char* VG_(nameCondcode) ( Condcode cond );
1256extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1257extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1258extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1259extern Int VG_(rankToRealRegNo) ( Int rank );
1260
1261extern void* VG_(jitmalloc) ( Int nbytes );
1262extern void VG_(jitfree) ( void* ptr );
1263
1264
1265/* ---------------------------------------------------------------------
1266 Exports of vg_execontext.c.
1267 ------------------------------------------------------------------ */
1268
1269/* Records the PC and a bit of the call chain. The first 4 %eip
1270 values are used in comparisons do remove duplicate errors, and for
1271 comparing against suppression specifications. The rest are purely
1272 informational (but often important). */
1273
1274typedef
1275 struct _ExeContextRec {
1276 struct _ExeContextRec * next;
1277 /* The size of this array is VG_(clo_backtrace_size); at least
1278 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1279 [1] is its caller, [2] is the caller of [1], etc. */
1280 Addr eips[0];
1281 }
1282 ExeContext;
1283
1284
1285/* Initialise the ExeContext storage mechanism. */
1286extern void VG_(init_ExeContext_storage) ( void );
1287
1288/* Print stats (informational only). */
1289extern void VG_(show_ExeContext_stats) ( void );
1290
1291
1292/* Take a snapshot of the client's stack. Search our collection of
1293 ExeContexts to see if we already have it, and if not, allocate a
1294 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001295extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1296 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001297
1298/* Print an ExeContext. */
1299extern void VG_(pp_ExeContext) ( ExeContext* );
1300
1301/* Compare two ExeContexts, just comparing the top two callers. */
1302extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1303
1304/* Compare two ExeContexts, just comparing the top four callers. */
1305extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1306
1307/* Compare two ExeContexts, comparing all callers. */
1308extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1309
1310
1311
1312/* ---------------------------------------------------------------------
1313 Exports of vg_errcontext.c.
1314 ------------------------------------------------------------------ */
1315
1316extern void VG_(load_suppressions) ( void );
1317extern void VG_(show_all_errors) ( void );
1318extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001319extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1320extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001321extern void VG_(record_address_error) ( Addr a, Int size,
1322 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001323
1324extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001325
1326extern void VG_(record_param_err) ( ThreadState* tst,
1327 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001328 Bool isWriteLack,
1329 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001330extern void VG_(record_user_err) ( ThreadState* tst,
1331 Addr a, Bool isWriteLack );
sewardj4dced352002-06-04 22:54:20 +00001332extern void VG_(record_pthread_err) ( ThreadId tid, Char* msg );
1333
sewardjde4a1d02002-03-22 01:27:54 +00001334
1335
1336/* The classification of a faulting address. */
1337typedef
sewardjb581a132002-05-08 00:32:50 +00001338 enum { Undescribed, /* as-yet unclassified */
1339 Stack,
1340 Unknown, /* classification yielded nothing useful */
1341 Freed, Mallocd,
1342 UserG, UserS }
sewardjde4a1d02002-03-22 01:27:54 +00001343 AddrKind;
1344
1345/* Records info about a faulting address. */
1346typedef
1347 struct {
1348 /* ALL */
1349 AddrKind akind;
1350 /* Freed, Mallocd */
1351 Int blksize;
1352 /* Freed, Mallocd */
1353 Int rwoffset;
1354 /* Freed, Mallocd */
1355 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001356 /* Stack */
1357 ThreadId stack_tid;
sewardjb581a132002-05-08 00:32:50 +00001358 /* True if is just-below %esp -- could be a gcc bug. */
1359 Bool maybe_gcc;
sewardjde4a1d02002-03-22 01:27:54 +00001360 }
1361 AddrInfo;
1362
1363
1364/* ---------------------------------------------------------------------
1365 Exports of vg_clientperms.c
1366 ------------------------------------------------------------------ */
1367
1368extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1369
sewardj8c824512002-04-14 04:16:48 +00001370extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001371
1372extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1373
1374extern void VG_(show_client_block_stats) ( void );
1375
1376
1377/* ---------------------------------------------------------------------
1378 Exports of vg_procselfmaps.c
1379 ------------------------------------------------------------------ */
1380
1381extern
1382void VG_(read_procselfmaps) (
1383 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1384);
1385
1386
1387/* ---------------------------------------------------------------------
1388 Exports of vg_symtab2.c
1389 ------------------------------------------------------------------ */
1390
1391/* We assume the executable is loaded here ... can't really find
1392 out. There is a hacky sanity check in vg_init_memory_audit()
1393 which should trip up most stupidities.
1394*/
1395#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1396
1397extern void VG_(read_symbols) ( void );
1398extern void VG_(mini_stack_dump) ( ExeContext* ec );
1399extern void VG_(what_obj_and_fun_is_this)
1400 ( Addr a,
1401 Char* obj_buf, Int n_obj_buf,
1402 Char* fun_buf, Int n_fun_buf );
njn4f9c9342002-04-29 16:03:24 +00001403extern Bool VG_(what_line_is_this) ( Addr a,
1404 UChar* filename, Int n_filename,
1405 UInt* lineno );
1406extern Bool VG_(what_fn_is_this) ( Bool no_demangle, Addr a,
1407 Char* fn_name, Int n_fn_name);
sewardjde4a1d02002-03-22 01:27:54 +00001408
sewardj18d75132002-05-16 11:06:21 +00001409extern Bool VG_(symtab_notify_munmap) ( Addr start, UInt length );
sewardjde4a1d02002-03-22 01:27:54 +00001410
1411
1412/* ---------------------------------------------------------------------
1413 Exports of vg_clientmalloc.c
1414 ------------------------------------------------------------------ */
1415
sewardjde4a1d02002-03-22 01:27:54 +00001416typedef
1417 enum {
1418 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001419 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001420 Vg_AllocNewVec = 2
1421 }
1422 VgAllocKind;
1423
1424/* Description of a malloc'd chunk. */
1425typedef
1426 struct _ShadowChunk {
1427 struct _ShadowChunk* next;
1428 ExeContext* where; /* where malloc'd/free'd */
1429 UInt size : 30; /* size requested. */
1430 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1431 Addr data; /* ptr to actual block. */
1432 }
1433 ShadowChunk;
1434
1435extern void VG_(clientmalloc_done) ( void );
1436extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1437extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1438
sewardj2e93c502002-04-12 11:12:52 +00001439/* These are called from the scheduler, when it intercepts a user
1440 request. */
sewardj8c824512002-04-14 04:16:48 +00001441extern void* VG_(client_malloc) ( ThreadState* tst,
1442 UInt size, VgAllocKind kind );
1443extern void* VG_(client_memalign) ( ThreadState* tst,
1444 UInt align, UInt size );
1445extern void VG_(client_free) ( ThreadState* tst,
1446 void* ptrV, VgAllocKind kind );
1447extern void* VG_(client_calloc) ( ThreadState* tst,
1448 UInt nmemb, UInt size1 );
1449extern void* VG_(client_realloc) ( ThreadState* tst,
1450 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001451
1452
1453/* ---------------------------------------------------------------------
1454 Exports of vg_main.c
1455 ------------------------------------------------------------------ */
1456
sewardjde4a1d02002-03-22 01:27:54 +00001457/* A structure used as an intermediary when passing the simulated
1458 CPU's state to some assembly fragments, particularly system calls.
1459 Stuff is copied from baseBlock to here, the assembly magic runs,
1460 and then the inverse copy is done. */
1461
1462extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1463 + 1 /* %eflags */
1464 + 1 /* %eip */
1465 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1466 ];
1467
1468/* Handy fns for doing the copy back and forth. */
1469extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1470extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1471
sewardjde4a1d02002-03-22 01:27:54 +00001472/* Called when some unhandleable client behaviour is detected.
1473 Prints a msg and aborts. */
1474extern void VG_(unimplemented) ( Char* msg );
sewardjcfc39b22002-05-08 01:58:18 +00001475extern void VG_(nvidia_moan) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001476
1477/* The stack on which Valgrind runs. We can't use the same stack as the
1478 simulatee -- that's an important design decision. */
1479extern UInt VG_(stack)[10000];
1480
1481/* Similarly, we have to ask for signals to be delivered on an
1482 alternative stack, since it is possible, although unlikely, that
1483 we'll have to run client code from inside the Valgrind-installed
1484 signal handler. If this happens it will be done by
1485 vg_deliver_signal_immediately(). */
1486extern UInt VG_(sigstack)[10000];
1487
sewardjde4a1d02002-03-22 01:27:54 +00001488/* Holds client's %esp at the point we gained control. From this the
1489 client's argc, argv and envp are deduced. */
1490extern Addr VG_(esp_at_startup);
1491extern Int VG_(client_argc);
1492extern Char** VG_(client_argv);
1493extern Char** VG_(client_envp);
1494
1495/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
sewardj3e1eb1f2002-05-18 13:14:17 +00001496 don't get traced into. Also mess up $libdir/valgrind so that our
1497 libpthread.so disappears from view. */
1498void VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) ( Char* ld_preload_str,
1499 Char* ld_library_path_str );
sewardjde4a1d02002-03-22 01:27:54 +00001500
1501/* Something of a function looking for a home ... start up GDB. This
1502 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1503 *client's* stack. This is necessary to give GDB the illusion that
1504 the client program really was running on the real cpu. */
1505extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1506
1507/* Spew out vast amounts of junk during JITting? */
1508extern Bool VG_(disassemble);
1509
1510/* 64-bit counter for the number of basic blocks done. */
1511extern ULong VG_(bbs_done);
1512/* 64-bit counter for the number of bbs to go before a debug exit. */
1513extern ULong VG_(bbs_to_go);
1514
1515/* Counts downwards in vg_run_innerloop. */
1516extern UInt VG_(dispatch_ctr);
1517
sewardjde4a1d02002-03-22 01:27:54 +00001518/* Is the client running on the simulated CPU or the real one? */
1519extern Bool VG_(running_on_simd_CPU); /* Initially False */
1520
1521/* The current LRU epoch. */
1522extern UInt VG_(current_epoch);
1523
sewardj7e87e382002-05-03 19:09:05 +00001524/* This is the ThreadId of the last thread the scheduler ran. */
1525extern ThreadId VG_(last_run_tid);
1526
sewardjde4a1d02002-03-22 01:27:54 +00001527
1528/* --- Counters, for informational purposes only. --- */
1529
1530/* Number of lookups which miss the fast tt helper. */
1531extern UInt VG_(tt_fast_misses);
1532
1533/* Counts for LRU informational messages. */
1534
1535/* Number and total o/t size of new translations this epoch. */
1536extern UInt VG_(this_epoch_in_count);
1537extern UInt VG_(this_epoch_in_osize);
1538extern UInt VG_(this_epoch_in_tsize);
1539/* Number and total o/t size of discarded translations this epoch. */
1540extern UInt VG_(this_epoch_out_count);
1541extern UInt VG_(this_epoch_out_osize);
1542extern UInt VG_(this_epoch_out_tsize);
1543/* Number and total o/t size of translations overall. */
1544extern UInt VG_(overall_in_count);
1545extern UInt VG_(overall_in_osize);
1546extern UInt VG_(overall_in_tsize);
1547/* Number and total o/t size of discards overall. */
1548extern UInt VG_(overall_out_count);
1549extern UInt VG_(overall_out_osize);
1550extern UInt VG_(overall_out_tsize);
1551
1552/* The number of LRU-clearings of TT/TC. */
1553extern UInt VG_(number_of_lrus);
1554
1555/* Counts pertaining to the register allocator. */
1556
1557/* total number of uinstrs input to reg-alloc */
1558extern UInt VG_(uinstrs_prealloc);
1559
1560/* total number of uinstrs added due to spill code */
1561extern UInt VG_(uinstrs_spill);
1562
1563/* number of bbs requiring spill code */
1564extern UInt VG_(translations_needing_spill);
1565
1566/* total of register ranks over all translations */
1567extern UInt VG_(total_reg_rank);
1568
sewardjde4a1d02002-03-22 01:27:54 +00001569/* Counts pertaining to internal sanity checking. */
1570extern UInt VG_(sanity_fast_count);
1571extern UInt VG_(sanity_slow_count);
1572
sewardj2e93c502002-04-12 11:12:52 +00001573/* Counts pertaining to the scheduler. */
1574extern UInt VG_(num_scheduling_events_MINOR);
1575extern UInt VG_(num_scheduling_events_MAJOR);
1576
sewardjde4a1d02002-03-22 01:27:54 +00001577
1578/* ---------------------------------------------------------------------
1579 Exports of vg_memory.c
1580 ------------------------------------------------------------------ */
1581
1582extern void VGM_(init_memory_audit) ( void );
1583extern Addr VGM_(curr_dataseg_end);
1584extern void VG_(show_reg_tags) ( void );
1585extern void VG_(detect_memory_leaks) ( void );
1586extern void VG_(done_prof_mem) ( void );
1587
1588/* Set permissions for an address range. Not speed-critical. */
1589extern void VGM_(make_noaccess) ( Addr a, UInt len );
1590extern void VGM_(make_writable) ( Addr a, UInt len );
1591extern void VGM_(make_readable) ( Addr a, UInt len );
1592/* Use with care! (read: use for shmat only) */
1593extern void VGM_(make_readwritable) ( Addr a, UInt len );
1594extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1595 UInt len );
1596
1597/* Check permissions for an address range. Not speed-critical. */
1598extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1599extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1600extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1601
sewardj0c3b53f2002-05-01 01:58:35 +00001602/* Sanity checks which may be done at any time. The scheduler decides
1603 when. */
1604extern void VG_(do_sanity_checks) ( Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001605/* Very cheap ... */
1606extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1607
1608/* These functions are called from generated code. */
1609extern void VG_(helperc_STOREV4) ( UInt, Addr );
1610extern void VG_(helperc_STOREV2) ( UInt, Addr );
1611extern void VG_(helperc_STOREV1) ( UInt, Addr );
1612
1613extern UInt VG_(helperc_LOADV1) ( Addr );
1614extern UInt VG_(helperc_LOADV2) ( Addr );
1615extern UInt VG_(helperc_LOADV4) ( Addr );
1616
1617extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1618extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1619extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1620
1621/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1622 space and pass the addresses and values of all addressible,
1623 defined, aligned words to notify_word. This is the basis for the
1624 leak detector. Returns the number of calls made to notify_word. */
1625UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1626
1627/* Is this address within some small distance below %ESP? Used only
1628 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001629extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001630
1631/* Nasty kludgery to deal with applications which switch stacks,
1632 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001633#define VG_PLAUSIBLE_STACK_SIZE 8000000
1634
sewardjc3bd5f52002-05-01 03:24:23 +00001635/* Needed by the pthreads implementation. */
1636#define VGM_WORD_VALID 0
1637#define VGM_WORD_INVALID 0xFFFFFFFF
1638
sewardjde4a1d02002-03-22 01:27:54 +00001639
1640/* ---------------------------------------------------------------------
1641 Exports of vg_syscall_mem.c
1642 ------------------------------------------------------------------ */
1643
sewardj2e93c502002-04-12 11:12:52 +00001644extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001645
sewardj2e93c502002-04-12 11:12:52 +00001646extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1647 Int syscallno,
1648 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001649
1650extern Bool VG_(is_kerror) ( Int res );
1651
sewardj018f7622002-05-15 21:13:39 +00001652#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1653 VG_(load_thread_state)(thread_id); \
1654 VG_(copy_baseBlock_to_m_state_static)(); \
1655 VG_(do_syscall)(); \
1656 VG_(copy_m_state_static_to_baseBlock)(); \
1657 VG_(save_thread_state)(thread_id); \
1658 VG_(threads)[thread_id].sh_eax = VGM_WORD_VALID; \
1659 result_lvalue = VG_(threads)[thread_id].m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001660
1661
1662/* ---------------------------------------------------------------------
1663 Exports of vg_transtab.c
1664 ------------------------------------------------------------------ */
1665
1666/* An entry in the translation table (TT). */
1667typedef
1668 struct {
1669 /* +0 */ Addr orig_addr;
1670 /* +4 */ Addr trans_addr;
1671 /* +8 */ UInt mru_epoch;
1672 /* +12 */ UShort orig_size;
1673 /* +14 */ UShort trans_size;
1674 }
1675 TTEntry;
1676
1677/* The number of basic blocks in an epoch (one age-step). */
1678#define VG_BBS_PER_EPOCH 20000
1679
1680extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1681extern void VG_(maybe_do_lru_pass) ( void );
1682extern void VG_(flush_transtab) ( void );
1683extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1684extern void VG_(add_to_trans_tab) ( TTEntry* tte );
sewardj18d75132002-05-16 11:06:21 +00001685extern void VG_(invalidate_translations) ( Addr start, UInt range );
sewardjde4a1d02002-03-22 01:27:54 +00001686
sewardj18d75132002-05-16 11:06:21 +00001687extern void VG_(init_tt_tc) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001688
1689extern void VG_(sanity_check_tc_tt) ( void );
1690extern Addr VG_(search_transtab) ( Addr original_addr );
1691
1692extern void VG_(invalidate_tt_fast)( void );
1693
1694
1695/* ---------------------------------------------------------------------
1696 Exports of vg_vtagops.c
1697 ------------------------------------------------------------------ */
1698
1699/* Lists the names of value-tag operations used in instrumented
1700 code. These are the third argument to TAG1 and TAG2 uinsns. */
1701
1702typedef
1703 enum {
1704 /* Unary. */
1705 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1706 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1707
1708 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1709
1710 VgT_Left4, VgT_Left2, VgT_Left1,
1711
1712 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1713 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1714
1715 /* Binary; 1st is rd; 2nd is rd+wr */
1716 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1717 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1718
1719 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1720 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1721 VgT_DebugFn
1722 }
1723 VgTagOp;
1724
1725extern Char* VG_(nameOfTagOp) ( VgTagOp );
1726extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1727
1728
1729/* ---------------------------------------------------------------------
1730 Exports of vg_syscall.S
1731 ------------------------------------------------------------------ */
1732
1733extern void VG_(do_syscall) ( void );
1734
1735
1736/* ---------------------------------------------------------------------
1737 Exports of vg_startup.S
1738 ------------------------------------------------------------------ */
1739
sewardjde4a1d02002-03-22 01:27:54 +00001740extern void VG_(switch_to_real_CPU) ( void );
1741
sewardj35805422002-04-21 13:05:34 +00001742extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1743 Addr m_esp_at_error,
1744 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001745
1746
1747/* ---------------------------------------------------------------------
1748 Exports of vg_dispatch.S
1749 ------------------------------------------------------------------ */
1750
sewardj2e93c502002-04-12 11:12:52 +00001751/* Run a thread for a (very short) while, until some event happens
1752 which means we need to defer to the scheduler. */
1753extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001754
1755
1756/* ---------------------------------------------------------------------
1757 Exports of vg_helpers.S
1758 ------------------------------------------------------------------ */
1759
sewardjde4a1d02002-03-22 01:27:54 +00001760/* Mul, div, etc, -- we don't codegen these directly. */
1761extern void VG_(helper_idiv_64_32);
1762extern void VG_(helper_div_64_32);
1763extern void VG_(helper_idiv_32_16);
1764extern void VG_(helper_div_32_16);
1765extern void VG_(helper_idiv_16_8);
1766extern void VG_(helper_div_16_8);
1767
1768extern void VG_(helper_imul_32_64);
1769extern void VG_(helper_mul_32_64);
1770extern void VG_(helper_imul_16_32);
1771extern void VG_(helper_mul_16_32);
1772extern void VG_(helper_imul_8_16);
1773extern void VG_(helper_mul_8_16);
1774
1775extern void VG_(helper_CLD);
1776extern void VG_(helper_STD);
1777extern void VG_(helper_get_dirflag);
1778
sewardj7d78e782002-06-02 00:04:00 +00001779extern void VG_(helper_CLC);
1780extern void VG_(helper_STC);
1781
sewardjde4a1d02002-03-22 01:27:54 +00001782extern void VG_(helper_shldl);
1783extern void VG_(helper_shldw);
1784extern void VG_(helper_shrdl);
1785extern void VG_(helper_shrdw);
1786
1787extern void VG_(helper_RDTSC);
1788extern void VG_(helper_CPUID);
1789
sewardjde4a1d02002-03-22 01:27:54 +00001790extern void VG_(helper_bsf);
1791extern void VG_(helper_bsr);
1792
1793extern void VG_(helper_fstsw_AX);
1794extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001795extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001796extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001797
1798extern void VG_(helper_value_check4_fail);
1799extern void VG_(helper_value_check2_fail);
1800extern void VG_(helper_value_check1_fail);
1801extern void VG_(helper_value_check0_fail);
1802
sewardj20917d82002-05-28 01:36:45 +00001803/* NOT A FUNCTION; this is a bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001804extern void VG_(signalreturn_bogusRA)( void );
sewardj20917d82002-05-28 01:36:45 +00001805
sewardj54cacf02002-04-12 23:24:59 +00001806
njn4f9c9342002-04-29 16:03:24 +00001807/* ---------------------------------------------------------------------
1808 Exports of vg_cachesim.c
1809 ------------------------------------------------------------------ */
1810
sewardj07133bf2002-06-13 10:25:56 +00001811extern Int VG_(log2) ( Int x );
njn7cf0bd32002-06-08 13:36:03 +00001812
sewardj07133bf2002-06-13 10:25:56 +00001813extern UCodeBlock* VG_(cachesim_instrument) ( UCodeBlock* cb_in,
1814 Addr orig_addr );
njn4f9c9342002-04-29 16:03:24 +00001815
1816typedef struct _iCC iCC;
1817typedef struct _idCC idCC;
1818
njn7cf0bd32002-06-08 13:36:03 +00001819extern void VG_(init_cachesim) ( void );
1820extern void VG_(do_cachesim_results)( Int client_argc, Char** client_argv );
njn4f9c9342002-04-29 16:03:24 +00001821
1822extern void VG_(cachesim_log_non_mem_instr)( iCC* cc );
1823extern void VG_(cachesim_log_mem_instr) ( idCC* cc, Addr data_addr );
sewardjde4a1d02002-03-22 01:27:54 +00001824
sewardj18d75132002-05-16 11:06:21 +00001825extern void VG_(cachesim_notify_discard) ( TTEntry* tte );
1826
1827
sewardjde4a1d02002-03-22 01:27:54 +00001828/* ---------------------------------------------------------------------
1829 The state of the simulated CPU.
1830 ------------------------------------------------------------------ */
1831
1832/* This is the Intel register encoding. */
1833#define R_EAX 0
1834#define R_ECX 1
1835#define R_EDX 2
1836#define R_EBX 3
1837#define R_ESP 4
1838#define R_EBP 5
1839#define R_ESI 6
1840#define R_EDI 7
1841
1842#define R_AL (0+R_EAX)
1843#define R_CL (0+R_ECX)
1844#define R_DL (0+R_EDX)
1845#define R_BL (0+R_EBX)
1846#define R_AH (4+R_EAX)
1847#define R_CH (4+R_ECX)
1848#define R_DH (4+R_EDX)
1849#define R_BH (4+R_EBX)
1850
1851
1852/* ---------------------------------------------------------------------
1853 Offsets into baseBlock for everything which needs to referred to
1854 from generated code. The order of these decls does not imply
1855 what the order of the actual offsets is. The latter is important
1856 and is set up in vg_main.c.
1857 ------------------------------------------------------------------ */
1858
1859/* An array of words. In generated code, %ebp always points to the
1860 start of this array. Useful stuff, like the simulated CPU state,
1861 and the addresses of helper functions, can then be found by
1862 indexing off %ebp. The following declares variables which, at
1863 startup time, are given values denoting offsets into baseBlock.
1864 These offsets are in *words* from the start of baseBlock. */
1865
1866#define VG_BASEBLOCK_WORDS 200
1867
1868extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1869
1870
1871/* -----------------------------------------------------
1872 Read-write parts of baseBlock.
1873 -------------------------------------------------- */
1874
1875/* State of the simulated CPU. */
1876extern Int VGOFF_(m_eax);
1877extern Int VGOFF_(m_ecx);
1878extern Int VGOFF_(m_edx);
1879extern Int VGOFF_(m_ebx);
1880extern Int VGOFF_(m_esp);
1881extern Int VGOFF_(m_ebp);
1882extern Int VGOFF_(m_esi);
1883extern Int VGOFF_(m_edi);
1884extern Int VGOFF_(m_eflags);
1885extern Int VGOFF_(m_fpustate);
1886extern Int VGOFF_(m_eip);
1887
1888/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1889extern Int VGOFF_(spillslots);
1890
1891/* Records the valid bits for the 8 integer regs & flags reg. */
1892extern Int VGOFF_(sh_eax);
1893extern Int VGOFF_(sh_ecx);
1894extern Int VGOFF_(sh_edx);
1895extern Int VGOFF_(sh_ebx);
1896extern Int VGOFF_(sh_esp);
1897extern Int VGOFF_(sh_ebp);
1898extern Int VGOFF_(sh_esi);
1899extern Int VGOFF_(sh_edi);
1900extern Int VGOFF_(sh_eflags);
1901
1902
1903/* -----------------------------------------------------
1904 Read-only parts of baseBlock.
1905 -------------------------------------------------- */
1906
1907/* Offsets of addresses of helper functions. A "helper" function is
1908 one which is called from generated code. */
1909
1910extern Int VGOFF_(helper_idiv_64_32);
1911extern Int VGOFF_(helper_div_64_32);
1912extern Int VGOFF_(helper_idiv_32_16);
1913extern Int VGOFF_(helper_div_32_16);
1914extern Int VGOFF_(helper_idiv_16_8);
1915extern Int VGOFF_(helper_div_16_8);
1916
1917extern Int VGOFF_(helper_imul_32_64);
1918extern Int VGOFF_(helper_mul_32_64);
1919extern Int VGOFF_(helper_imul_16_32);
1920extern Int VGOFF_(helper_mul_16_32);
1921extern Int VGOFF_(helper_imul_8_16);
1922extern Int VGOFF_(helper_mul_8_16);
1923
1924extern Int VGOFF_(helper_CLD);
1925extern Int VGOFF_(helper_STD);
1926extern Int VGOFF_(helper_get_dirflag);
1927
sewardj7d78e782002-06-02 00:04:00 +00001928extern Int VGOFF_(helper_CLC);
1929extern Int VGOFF_(helper_STC);
1930
sewardjde4a1d02002-03-22 01:27:54 +00001931extern Int VGOFF_(helper_shldl);
1932extern Int VGOFF_(helper_shldw);
1933extern Int VGOFF_(helper_shrdl);
1934extern Int VGOFF_(helper_shrdw);
1935
1936extern Int VGOFF_(helper_RDTSC);
1937extern Int VGOFF_(helper_CPUID);
1938
sewardjde4a1d02002-03-22 01:27:54 +00001939extern Int VGOFF_(helper_bsf);
1940extern Int VGOFF_(helper_bsr);
1941
1942extern Int VGOFF_(helper_fstsw_AX);
1943extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001944extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001945extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001946
1947extern Int VGOFF_(helper_value_check4_fail);
1948extern Int VGOFF_(helper_value_check2_fail);
1949extern Int VGOFF_(helper_value_check1_fail);
1950extern Int VGOFF_(helper_value_check0_fail);
1951
sewardjde4a1d02002-03-22 01:27:54 +00001952extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1953extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1954extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1955
1956extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1957extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1958extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1959
1960extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1961extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1962extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1963
njn4f9c9342002-04-29 16:03:24 +00001964extern Int VGOFF_(cachesim_log_non_mem_instr);
1965extern Int VGOFF_(cachesim_log_mem_instr);
sewardjde4a1d02002-03-22 01:27:54 +00001966
1967#endif /* ndef __VG_INCLUDE_H */
1968
sewardj3b2736a2002-03-24 12:18:35 +00001969
1970/* ---------------------------------------------------------------------
1971 Finally - autoconf-generated settings
1972 ------------------------------------------------------------------ */
1973
1974#include "config.h"
1975
sewardjde4a1d02002-03-22 01:27:54 +00001976/*--------------------------------------------------------------------*/
1977/*--- end vg_include.h ---*/
1978/*--------------------------------------------------------------------*/