blob: bdafd3f8e6f8e60dc24da4db3c0a52cd15a7f73b [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. */
sewardj8208ae82002-06-17 14:25:00 +0000140#define VG_N_THREADS 50
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. */
sewardj8208ae82002-06-17 14:25:00 +0000144#define VG_N_THREAD_KEYS 50
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
sewardj9a2224b2002-06-19 10:17:40 +0000508#define VG_USERREQ__GET_N_SIGS_RETURNED 0x3024
sewardjef037c72002-05-30 00:40:03 +0000509
sewardj4dced352002-06-04 22:54:20 +0000510
sewardj45b4b372002-04-16 22:50:32 +0000511/* Cosmetic ... */
512#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
sewardj4dced352002-06-04 22:54:20 +0000513/* Log a pthread error from client-space. Cosmetic. */
514#define VG_USERREQ__PTHREAD_ERROR 0x3102
sewardj45b4b372002-04-16 22:50:32 +0000515
sewardj54cacf02002-04-12 23:24:59 +0000516/*
517In vg_constants.h:
518#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardj54cacf02002-04-12 23:24:59 +0000519*/
520
521
sewardj2e93c502002-04-12 11:12:52 +0000522/* ---------------------------------------------------------------------
523 Constants pertaining to the simulated CPU state, VG_(baseBlock),
524 which need to go here to avoid ugly circularities.
525 ------------------------------------------------------------------ */
526
527/* How big is the saved FPU state? */
528#define VG_SIZE_OF_FPUSTATE 108
529/* ... and in words ... */
530#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
531
532
533/* ---------------------------------------------------------------------
534 Exports of vg_scheduler.c
535 ------------------------------------------------------------------ */
536
537/* ThreadIds are simply indices into the vg_threads[] array. */
538typedef
539 UInt
540 ThreadId;
541
sewardj6072c362002-04-19 14:40:57 +0000542/* Special magic value for an invalid ThreadId. It corresponds to
543 LinuxThreads using zero as the initial value for
544 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
545#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000546
547typedef
548 enum {
549 VgTs_Empty, /* this slot is not in use */
550 VgTs_Runnable, /* waiting to be scheduled */
551 VgTs_WaitJoiner, /* waiting for someone to do join on me */
552 VgTs_WaitJoinee, /* waiting for the thread I did join on */
553 VgTs_WaitFD, /* waiting for I/O completion on a fd */
554 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000555 VgTs_WaitCV, /* waiting on a condition variable */
sewardjb48e5002002-05-13 00:16:03 +0000556 VgTs_WaitSIG, /* waiting due to sigwait() */
sewardj2e93c502002-04-12 11:12:52 +0000557 VgTs_Sleeping /* sleeping for a while */
558 }
559 ThreadStatus;
sewardj8ad94e12002-05-29 00:10:20 +0000560
561/* An entry in a threads's cleanup stack. */
562typedef
563 struct {
564 void (*fn)(void*);
565 void* arg;
566 }
567 CleanupEntry;
sewardj2e93c502002-04-12 11:12:52 +0000568
569typedef
570 struct {
sewardj6072c362002-04-19 14:40:57 +0000571 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
572 The thread identity is simply the index in vg_threads[].
573 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000574 that we don't try and allocate or deallocate its stack. For
575 convenience of generating error message, we also put the
576 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000577 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000578 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000579
sewardj5f07b662002-04-23 16:52:51 +0000580 /* Current scheduling status.
581
582 Complications: whenever this is set to VgTs_WaitMX, you
583 should also set .m_edx to whatever the required return value
584 is for pthread_mutex_lock / pthread_cond_timedwait for when
585 the mutex finally gets unblocked. */
sewardj2e93c502002-04-12 11:12:52 +0000586 ThreadStatus status;
587
sewardj3b5d8862002-04-20 13:53:23 +0000588 /* When .status == WaitMX, points to the mutex I am waiting for.
589 When .status == WaitCV, points to the mutex associated with
590 the condition variable indicated by the .associated_cv field.
591 In all other cases, should be NULL. */
592 void* /* pthread_mutex_t* */ associated_mx;
593
594 /* When .status == WaitCV, points to the condition variable I am
595 waiting for. In all other cases, should be NULL. */
596 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000597
sewardj5f07b662002-04-23 16:52:51 +0000598 /* If VgTs_Sleeping, this is when we should wake up, measured in
599 milliseconds as supplied by VG_(read_millisecond_counter).
600
601 If VgTs_WaitCV, this indicates the time at which
602 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
603 this means infinitely far in the future, viz,
604 pthread_cond_wait. */
605 UInt awaken_at;
sewardj2e93c502002-04-12 11:12:52 +0000606
sewardj20917d82002-05-28 01:36:45 +0000607 /* If VgTs_WaitJoiner, return value, as generated by joinees. */
608 void* joinee_retval;
609
610 /* If VgTs_WaitJoinee, place to copy the return value to, and
611 the identity of the thread we're waiting for. */
612 void** joiner_thread_return;
613 ThreadId joiner_jee_tid;
614
sewardj8ad94e12002-05-29 00:10:20 +0000615 /* Whether or not detached. */
616 Bool detached;
617
sewardj20917d82002-05-28 01:36:45 +0000618 /* Cancelability state and type. */
619 Bool cancel_st; /* False==PTH_CANCEL_DISABLE; True==.._ENABLE */
620 Bool cancel_ty; /* False==PTH_CANC_ASYNCH; True==..._DEFERRED */
621
622 /* Pointer to fn to call to do cancellation. Indicates whether
623 or not cancellation is pending. If NULL, not pending. Else
624 should be &thread_exit_wrapper(), indicating that
625 cancallation is pending. */
626 void (*cancel_pend)(void*);
627
sewardj8ad94e12002-05-29 00:10:20 +0000628 /* The cleanup stack. */
629 Int custack_used;
630 CleanupEntry custack[VG_N_CLEANUPSTACK];
sewardj2e93c502002-04-12 11:12:52 +0000631
sewardj5f07b662002-04-23 16:52:51 +0000632 /* thread-specific data */
633 void* specifics[VG_N_THREAD_KEYS];
634
sewardjb48e5002002-05-13 00:16:03 +0000635 /* This thread's blocked-signals mask. Semantics is that for a
636 signal to be delivered to this thread, the signal must not be
637 blocked by either the process-wide signal mask nor by this
638 one. So, if this thread is prepared to handle any signal that
639 the process as a whole is prepared to handle, this mask should
640 be made empty -- and that it is its default, starting
641 state. */
642 vki_ksigset_t sig_mask;
643
644 /* When not VgTs_WaitSIG, has no meaning. When VgTs_WaitSIG,
645 is the set of signals for which we are sigwait()ing. */
646 vki_ksigset_t sigs_waited_for;
647
sewardj9a2224b2002-06-19 10:17:40 +0000648 /* Counts the number of times a signal handler for this thread
649 has returned. This makes it easy to implement pause(), by
650 polling this value, of course interspersed with nanosleeps,
651 and waiting till it changes. */
652 UInt n_signals_returned;
653
sewardj2e93c502002-04-12 11:12:52 +0000654 /* Stacks. When a thread slot is freed, we don't deallocate its
655 stack; we just leave it lying around for the next use of the
656 slot. If the next use of the slot requires a larger stack,
657 only then is the old one deallocated and a new one
658 allocated.
659
660 For the main thread (threadid == 0), this mechanism doesn't
661 apply. We don't know the size of the stack since we didn't
662 allocate it, and furthermore we never reallocate it. */
663
664 /* The allocated size of this thread's stack (permanently zero
665 if this is ThreadId == 0, since we didn't allocate its stack) */
666 UInt stack_size;
667
668 /* Address of the lowest word in this thread's stack. NULL means
669 not allocated yet.
670 */
671 Addr stack_base;
672
sewardj1e8cdc92002-04-18 11:37:52 +0000673 /* Address of the highest legitimate word in this stack. This is
674 used for error messages only -- not critical for execution
675 correctness. Is is set for all stacks, specifically including
676 ThreadId == 0 (the main thread). */
677 Addr stack_highest_word;
678
sewardj2e93c502002-04-12 11:12:52 +0000679 /* Saved machine context. */
680 UInt m_eax;
681 UInt m_ebx;
682 UInt m_ecx;
683 UInt m_edx;
684 UInt m_esi;
685 UInt m_edi;
686 UInt m_ebp;
687 UInt m_esp;
688 UInt m_eflags;
689 UInt m_eip;
690 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
691
692 UInt sh_eax;
693 UInt sh_ebx;
694 UInt sh_ecx;
695 UInt sh_edx;
696 UInt sh_esi;
697 UInt sh_edi;
698 UInt sh_ebp;
699 UInt sh_esp;
700 UInt sh_eflags;
701 }
702 ThreadState;
703
704
sewardj018f7622002-05-15 21:13:39 +0000705/* The thread table. */
706extern ThreadState VG_(threads)[VG_N_THREADS];
707
708/* Check that tid is in range and denotes a non-Empty thread. */
sewardjb48e5002002-05-13 00:16:03 +0000709extern Bool VG_(is_valid_tid) ( ThreadId tid );
710
sewardj018f7622002-05-15 21:13:39 +0000711/* Check that tid is in range. */
712extern Bool VG_(is_valid_or_empty_tid) ( ThreadId tid );
713
sewardj2e93c502002-04-12 11:12:52 +0000714/* Copy the specified thread's state into VG_(baseBlock) in
715 preparation for running it. */
716extern void VG_(load_thread_state)( ThreadId );
717
718/* Save the specified thread's state back in VG_(baseBlock), and fill
719 VG_(baseBlock) with junk, for sanity-check reasons. */
720extern void VG_(save_thread_state)( ThreadId );
721
sewardj1e8cdc92002-04-18 11:37:52 +0000722/* And for the currently running one, if valid. */
723extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000724
sewardj1e8cdc92002-04-18 11:37:52 +0000725/* Similarly ... */
726extern ThreadId VG_(get_current_tid) ( void );
727
728/* Which thread is this address in the stack of, if any? Used for
729 error message generation. */
730extern ThreadId VG_(identify_stack_addr)( Addr a );
731
sewardjccef2e62002-05-29 19:26:32 +0000732/* Nuke all threads except tid. */
733extern void VG_(nuke_all_threads_except) ( ThreadId me );
734
sewardj2e93c502002-04-12 11:12:52 +0000735
736/* Return codes from the scheduler. */
737typedef
sewardj7e87e382002-05-03 19:09:05 +0000738 enum {
739 VgSrc_Deadlock, /* no runnable threads and no prospect of any
740 even if we wait for a long time */
741 VgSrc_ExitSyscall, /* client called exit(). This is the normal
742 route out. */
743 VgSrc_BbsDone /* In a debugging run, the specified number of
744 bbs has been completed. */
745 }
sewardj2e93c502002-04-12 11:12:52 +0000746 VgSchedReturnCode;
747
sewardj7e87e382002-05-03 19:09:05 +0000748
sewardj2e93c502002-04-12 11:12:52 +0000749/* The scheduler. */
750extern VgSchedReturnCode VG_(scheduler) ( void );
751
752extern void VG_(scheduler_init) ( void );
753
sewardj15a43e12002-04-17 19:35:12 +0000754extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000755
756/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
757extern jmp_buf VG_(scheduler_jmpbuf);
758/* ... and if so, here's the signal which caused it to do so. */
759extern Int VG_(longjmpd_on_signal);
760
761
sewardja1679dd2002-05-10 22:31:40 +0000762/* Possible places where the main stack might be based. We check that
763 the initial stack, which we can't move, is allocated here.
764 VG_(scheduler_init) checks this. Andrea Archelangi's 2.4 kernels
765 have been rumoured to start stacks at 0x80000000, so that too is
766 considered.
sewardj2e93c502002-04-12 11:12:52 +0000767*/
sewardja1679dd2002-05-10 22:31:40 +0000768#define VG_STARTUP_STACK_BASE_1 (Addr)0xC0000000
769#define VG_STARTUP_STACK_BASE_2 (Addr)0x80000000
770#define VG_STARTUP_STACK_SMALLERTHAN 0x100000 /* 1024k */
771
772#define VG_STACK_MATCHES_BASE(zzstack, zzbase) \
773 ( \
774 ((zzstack) & ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN)) \
775 == \
776 ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN) \
777 )
sewardj2e93c502002-04-12 11:12:52 +0000778
779
780/* The red-zone size which we put at the bottom (highest address) of
781 thread stacks, for paranoia reasons. This can be arbitrary, and
782 doesn't really need to be set at compile time. */
783#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
784
785#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
786 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
787
788
sewardj018f7622002-05-15 21:13:39 +0000789/* Write a value to the client's %EDX (request return value register)
790 and set the shadow to indicate it is defined. */
791#define SET_EDX(zztid, zzval) \
792 do { VG_(threads)[zztid].m_edx = (zzval); \
793 VG_(threads)[zztid].sh_edx = VGM_WORD_VALID; \
794 } while (0)
795
796#define SET_EAX(zztid, zzval) \
797 do { VG_(threads)[zztid].m_eax = (zzval); \
798 VG_(threads)[zztid].sh_eax = VGM_WORD_VALID; \
799 } while (0)
800
sewardj2e93c502002-04-12 11:12:52 +0000801
802/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000803 Exports of vg_signals.c
804 ------------------------------------------------------------------ */
805
sewardjde4a1d02002-03-22 01:27:54 +0000806extern void VG_(sigstartup_actions) ( void );
807
sewardjb48e5002002-05-13 00:16:03 +0000808extern Bool VG_(deliver_signals) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000809extern void VG_(unblock_host_signal) ( Int sigNo );
sewardj018f7622002-05-15 21:13:39 +0000810extern void VG_(handle_SCSS_change) ( Bool force_update );
811
sewardjde4a1d02002-03-22 01:27:54 +0000812
813/* Fake system calls for signal handling. */
sewardj2342c972002-05-22 23:34:20 +0000814extern void VG_(do__NR_sigaltstack) ( ThreadId tid );
sewardj2e93c502002-04-12 11:12:52 +0000815extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardj018f7622002-05-15 21:13:39 +0000816extern void VG_(do__NR_sigprocmask) ( ThreadId tid,
817 Int how,
818 vki_ksigset_t* set,
819 vki_ksigset_t* oldset );
820extern void VG_(do_pthread_sigmask_SCSS_upd) ( ThreadId tid,
821 Int how,
822 vki_ksigset_t* set,
823 vki_ksigset_t* oldset );
824extern void VG_(send_signal_to_thread) ( ThreadId thread,
825 Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000826
sewardj2e93c502002-04-12 11:12:52 +0000827/* Modify the current thread's state once we have detected it is
828 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000829extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000830
sewardj2e93c502002-04-12 11:12:52 +0000831/* Handy utilities to block/restore all host signals. */
832extern void VG_(block_all_host_signals)
833 ( /* OUT */ vki_ksigset_t* saved_mask );
sewardj018f7622002-05-15 21:13:39 +0000834extern void VG_(restore_all_host_signals)
sewardj2e93c502002-04-12 11:12:52 +0000835 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000836
837/* ---------------------------------------------------------------------
838 Exports of vg_mylibc.c
839 ------------------------------------------------------------------ */
840
841
sewardjfbe18b92002-05-10 00:46:59 +0000842#if !defined(NULL)
843# define NULL ((void*)0)
844#endif
sewardjde4a1d02002-03-22 01:27:54 +0000845
846extern void VG_(exit)( Int status )
847 __attribute__ ((__noreturn__));
848
849extern void VG_(printf) ( const char *format, ... );
850/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
851
852extern void VG_(sprintf) ( Char* buf, Char *format, ... );
853
854extern void VG_(vprintf) ( void(*send)(Char),
855 const Char *format, va_list vargs );
856
857extern Bool VG_(isspace) ( Char c );
njn7cf0bd32002-06-08 13:36:03 +0000858extern Bool VG_(isdigit) ( Char c );
sewardjde4a1d02002-03-22 01:27:54 +0000859
860extern Int VG_(strlen) ( const Char* str );
861
862extern Long VG_(atoll) ( Char* str );
sewardja70ca3f2002-05-30 01:22:20 +0000863extern Long VG_(atoll36) ( Char* str );
sewardjde4a1d02002-03-22 01:27:54 +0000864
865extern Char* VG_(strcat) ( Char* dest, const Char* src );
866extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
867extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
868
869extern Char* VG_(strcpy) ( Char* dest, const Char* src );
870
871extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
872extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
873
874extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
875extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
876
877extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
878extern Char* VG_(strchr) ( const Char* s, Char c );
879extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
880
881extern Char* VG_(getenv) ( Char* name );
882extern Int VG_(getpid) ( void );
sewardj5f07b662002-04-23 16:52:51 +0000883
884extern void VG_(start_rdtsc_calibration) ( void );
885extern void VG_(end_rdtsc_calibration) ( void );
886extern UInt VG_(read_millisecond_timer) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000887
888
889extern Char VG_(toupper) ( Char c );
890
891extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
892
893extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
894
895extern Bool VG_(stringMatch) ( Char* pat, Char* str );
896
897
sewardj3e1eb1f2002-05-18 13:14:17 +0000898#define VG__STRING(__str) #__str
sewardjde4a1d02002-03-22 01:27:54 +0000899
900/* Asserts are permanently enabled. Hurrah! */
901#define vg_assert(expr) \
902 ((void) ((expr) ? 0 : \
sewardj3e1eb1f2002-05-18 13:14:17 +0000903 (VG_(assert_fail) (VG__STRING(expr), \
sewardjde4a1d02002-03-22 01:27:54 +0000904 __FILE__, __LINE__, \
905 __PRETTY_FUNCTION__), 0)))
906
907extern void VG_(assert_fail) ( Char* expr, Char* file,
908 Int line, Char* fn )
909 __attribute__ ((__noreturn__));
910
njn4f9c9342002-04-29 16:03:24 +0000911/* Reading and writing files. */
sewardjde4a1d02002-03-22 01:27:54 +0000912extern Int VG_(open_read) ( Char* pathname );
njn4f9c9342002-04-29 16:03:24 +0000913extern Int VG_(open_write) ( Char* pathname );
914extern Int VG_(create_and_write) ( Char* pathname );
sewardjde4a1d02002-03-22 01:27:54 +0000915extern void VG_(close) ( Int fd );
916extern Int VG_(read) ( Int fd, void* buf, Int count);
917extern Int VG_(write) ( Int fd, void* buf, Int count);
sewardjb3586202002-05-09 17:38:13 +0000918extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
sewardjde4a1d02002-03-22 01:27:54 +0000919
sewardj2e93c502002-04-12 11:12:52 +0000920extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
921
922extern Int VG_(select)( Int n,
923 vki_fd_set* readfds,
924 vki_fd_set* writefds,
925 vki_fd_set* exceptfds,
926 struct vki_timeval * timeout );
927extern Int VG_(nanosleep)( const struct vki_timespec *req,
928 struct vki_timespec *rem );
929
930
sewardjde4a1d02002-03-22 01:27:54 +0000931/* mmap-ery ... */
932extern void* VG_(mmap)( void* start, UInt length,
933 UInt prot, UInt flags, UInt fd, UInt offset );
934
sewardj2e93c502002-04-12 11:12:52 +0000935extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000936
sewardjb3586202002-05-09 17:38:13 +0000937extern void* VG_(brk) ( void* end_data_segment );
938
sewardjde4a1d02002-03-22 01:27:54 +0000939
940/* Print a (panic) message, and abort. */
941extern void VG_(panic) ( Char* str )
942 __attribute__ ((__noreturn__));
943
944/* Get memory by anonymous mmap. */
sewardje9047952002-06-05 20:28:33 +0000945extern void* VG_(get_memory_from_mmap) ( Int nBytes, Char* who );
sewardje6a25242002-04-21 22:03:07 +0000946
947/* Crude stand-in for the glibc system() call. */
948extern Int VG_(system) ( Char* cmd );
949
sewardjde4a1d02002-03-22 01:27:54 +0000950
951/* Signal stuff. Note that these use the vk_ (kernel) structure
952 definitions, which are different in places from those that glibc
953 defines. Since we're operating right at the kernel interface,
954 glibc's view of the world is entirely irrelevant. */
sewardj018f7622002-05-15 21:13:39 +0000955
956/* --- Signal set ops --- */
sewardjb48e5002002-05-13 00:16:03 +0000957extern Int VG_(ksigfillset)( vki_ksigset_t* set );
958extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
sewardjde4a1d02002-03-22 01:27:54 +0000959
sewardj018f7622002-05-15 21:13:39 +0000960extern Bool VG_(kisfullsigset)( vki_ksigset_t* set );
961extern Bool VG_(kisemptysigset)( vki_ksigset_t* set );
962
963extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
964extern Int VG_(ksigdelset)( vki_ksigset_t* set, Int signum );
965extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
966
sewardjb48e5002002-05-13 00:16:03 +0000967extern void VG_(ksigaddset_from_set)( vki_ksigset_t* dst,
968 vki_ksigset_t* src );
969extern void VG_(ksigdelset_from_set)( vki_ksigset_t* dst,
970 vki_ksigset_t* src );
971
sewardj018f7622002-05-15 21:13:39 +0000972/* --- Mess with the kernel's sig state --- */
973extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
974 vki_ksigset_t* oldset );
975extern Int VG_(ksigaction) ( Int signum,
976 const vki_ksigaction* act,
977 vki_ksigaction* oldact );
sewardjde4a1d02002-03-22 01:27:54 +0000978
979extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
980
981extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
982
sewardj018f7622002-05-15 21:13:39 +0000983extern Int VG_(kill)( Int pid, Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000984
985
986/* ---------------------------------------------------------------------
987 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
988 vg_from_ucode.c).
989 ------------------------------------------------------------------ */
990
991/* Tags which describe what operands are. */
992typedef
993 enum { TempReg=0, ArchReg=1, RealReg=2,
994 SpillNo=3, Literal=4, Lit16=5,
995 NoValue=6 }
996 Tag;
997
998
999/* Microinstruction opcodes. */
1000typedef
1001 enum {
1002 NOP,
1003 GET,
1004 PUT,
1005 LOAD,
1006 STORE,
1007 MOV,
1008 CMOV, /* Used for cmpxchg and cmov */
1009 WIDEN,
1010 JMP,
1011
1012 /* Read/write the %EFLAGS register into a TempReg. */
1013 GETF, PUTF,
1014
1015 ADD, ADC, AND, OR, XOR, SUB, SBB,
1016 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
1017 NOT, NEG, INC, DEC, BSWAP,
1018 CC2VAL,
1019
1020 /* Not strictly needed, but useful for making better
1021 translations of address calculations. */
1022 LEA1, /* reg2 := const + reg1 */
1023 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
1024
1025 /* not for translating x86 calls -- only to call helpers */
1026 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
1027 for CALLM. */
1028 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
1029 CALLM, /* call to a machine-code helper */
1030
1031 /* Hack for translating string (REP-) insns. Jump to literal if
1032 TempReg/RealReg is zero. */
1033 JIFZ,
1034
1035 /* FPU ops which read/write mem or don't touch mem at all. */
1036 FPU_R,
1037 FPU_W,
1038 FPU,
1039
1040 /* Advance the simulated %eip by some small (< 128) number. */
1041 INCEIP,
1042
1043 /* uinstrs which are not needed for mere translation of x86 code,
1044 only for instrumentation of it. */
1045 LOADV,
1046 STOREV,
1047 GETV,
1048 PUTV,
1049 TESTV,
1050 SETV,
1051 /* Get/set the v-bit (and it is only one bit) for the simulated
1052 %eflags register. */
1053 GETVF,
1054 PUTVF,
1055
1056 /* Do a unary or binary tag op. Only for post-instrumented
1057 code. For TAG1, first and only arg is a TempReg, and is both
1058 arg and result reg. For TAG2, first arg is src, second is
1059 dst, in the normal way; both are TempRegs. In both cases,
1060 3rd arg is a RiCHelper with a Lit16 tag. This indicates
1061 which tag op to do. */
1062 TAG1,
1063 TAG2
1064 }
1065 Opcode;
1066
1067
1068/* Condition codes, observing the Intel encoding. CondAlways is an
1069 extra. */
1070typedef
1071 enum {
1072 CondO = 0, /* overflow */
1073 CondNO = 1, /* no overflow */
1074 CondB = 2, /* below */
1075 CondNB = 3, /* not below */
1076 CondZ = 4, /* zero */
1077 CondNZ = 5, /* not zero */
1078 CondBE = 6, /* below or equal */
1079 CondNBE = 7, /* not below or equal */
1080 CondS = 8, /* negative */
1081 ConsNS = 9, /* not negative */
1082 CondP = 10, /* parity even */
1083 CondNP = 11, /* not parity even */
1084 CondL = 12, /* jump less */
1085 CondNL = 13, /* not less */
1086 CondLE = 14, /* less or equal */
1087 CondNLE = 15, /* not less or equal */
1088 CondAlways = 16 /* Jump always */
1089 }
1090 Condcode;
1091
1092
sewardj2e93c502002-04-12 11:12:52 +00001093/* Descriptions of additional properties of *unconditional* jumps. */
1094typedef
1095 enum {
1096 JmpBoring=0, /* boring unconditional jump */
1097 JmpCall=1, /* jump due to an x86 call insn */
1098 JmpRet=2, /* jump due to an x86 ret insn */
1099 JmpSyscall=3, /* do a system call, then jump */
1100 JmpClientReq=4 /* do a client request, then jump */
1101 }
1102 JmpKind;
1103
1104
sewardjde4a1d02002-03-22 01:27:54 +00001105/* Flags. User-level code can only read/write O(verflow), S(ign),
1106 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
1107 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
1108 thusly:
1109 76543210
1110 DOSZACP
1111 and bit 7 must always be zero since it is unused.
1112*/
1113typedef UChar FlagSet;
1114
1115#define FlagD (1<<6)
1116#define FlagO (1<<5)
1117#define FlagS (1<<4)
1118#define FlagZ (1<<3)
1119#define FlagA (1<<2)
1120#define FlagC (1<<1)
1121#define FlagP (1<<0)
1122
1123#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
1124#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
1125#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
1126#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
1127#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
1128#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +00001129#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +00001130#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +00001131#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +00001132
1133#define FlagsALL (FlagsOSZACP | FlagD)
1134#define FlagsEmpty (FlagSet)0
1135
1136#define VG_IS_FLAG_SUBSET(set1,set2) \
1137 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
1138
1139#define VG_UNION_FLAG_SETS(set1,set2) \
1140 ( ((FlagSet)set1) | ((FlagSet)set2) )
1141
1142
1143
1144/* A Micro (u)-instruction. */
1145typedef
1146 struct {
1147 /* word 1 */
1148 UInt lit32; /* 32-bit literal */
1149
1150 /* word 2 */
1151 UShort val1; /* first operand */
1152 UShort val2; /* second operand */
1153
1154 /* word 3 */
1155 UShort val3; /* third operand */
1156 UChar opcode; /* opcode */
1157 UChar size; /* data transfer size */
1158
1159 /* word 4 */
1160 FlagSet flags_r; /* :: FlagSet */
1161 FlagSet flags_w; /* :: FlagSet */
1162 UChar tag1:4; /* first operand tag */
1163 UChar tag2:4; /* second operand tag */
1164 UChar tag3:4; /* third operand tag */
1165 UChar extra4b:4; /* Spare field, used by WIDEN for src
1166 -size, and by LEA2 for scale
njn4f9c9342002-04-29 16:03:24 +00001167 (1,2,4 or 8), and by unconditional JMPs for
1168 orig x86 instr size if --cachesim=yes */
1169
sewardjde4a1d02002-03-22 01:27:54 +00001170
1171 /* word 5 */
1172 UChar cond; /* condition, for jumps */
1173 Bool smc_check:1; /* do a smc test, if writes memory. */
1174 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +00001175 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +00001176 }
1177 UInstr;
1178
1179
1180/* Expandable arrays of uinstrs. */
1181typedef
1182 struct {
1183 Int used;
1184 Int size;
1185 UInstr* instrs;
1186 Int nextTemp;
1187 }
1188 UCodeBlock;
1189
1190/* Refer to `the last instruction stuffed in', including as an
1191 lvalue. */
1192#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1193
1194/* An invalid temporary number :-) */
1195#define INVALID_TEMPREG 999999999
1196
1197
1198/* ---------------------------------------------------------------------
1199 Exports of vg_demangle.c
1200 ------------------------------------------------------------------ */
1201
1202extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
1203
1204
1205/* ---------------------------------------------------------------------
1206 Exports of vg_from_ucode.c
1207 ------------------------------------------------------------------ */
1208
1209extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
1210
1211
1212/* ---------------------------------------------------------------------
1213 Exports of vg_to_ucode.c
1214 ------------------------------------------------------------------ */
1215
1216extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
1217extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
1218extern Char VG_(nameOfIntSize) ( Int size );
1219extern UInt VG_(extend_s_8to32) ( UInt x );
1220extern Int VG_(getNewTemp) ( UCodeBlock* cb );
1221extern Int VG_(getNewShadow) ( UCodeBlock* cb );
1222
1223#define SHADOW(tempreg) ((tempreg)+1)
1224
1225
1226/* ---------------------------------------------------------------------
1227 Exports of vg_translate.c
1228 ------------------------------------------------------------------ */
1229
sewardj1e8cdc92002-04-18 11:37:52 +00001230extern void VG_(translate) ( ThreadState* tst,
1231 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001232 UInt* orig_size,
1233 Addr* trans_addr,
1234 UInt* trans_size );
1235
1236extern void VG_(emptyUInstr) ( UInstr* u );
1237extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1238extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
1239 Tag tag1, UInt val1 );
1240extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
1241 Tag tag1, UInt val1,
1242 Tag tag2, UInt val2 );
1243extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
1244 Tag tag1, UInt val1,
1245 Tag tag2, UInt val2,
1246 Tag tag3, UInt val3 );
1247extern void VG_(setFlagRW) ( UInstr* u,
1248 FlagSet fr, FlagSet fw );
1249
1250extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1251extern Bool VG_(anyFlagUse) ( UInstr* u );
1252
1253
1254
1255extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1256extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1257
njn4f9c9342002-04-29 16:03:24 +00001258extern UCodeBlock* VG_(allocCodeBlock) ( void );
1259extern void VG_(freeCodeBlock) ( UCodeBlock* cb );
1260extern void VG_(copyUInstr) ( UCodeBlock* cb, UInstr* instr );
1261
sewardjde4a1d02002-03-22 01:27:54 +00001262extern Char* VG_(nameCondcode) ( Condcode cond );
1263extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1264extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1265extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1266extern Int VG_(rankToRealRegNo) ( Int rank );
1267
1268extern void* VG_(jitmalloc) ( Int nbytes );
1269extern void VG_(jitfree) ( void* ptr );
1270
1271
1272/* ---------------------------------------------------------------------
1273 Exports of vg_execontext.c.
1274 ------------------------------------------------------------------ */
1275
1276/* Records the PC and a bit of the call chain. The first 4 %eip
1277 values are used in comparisons do remove duplicate errors, and for
1278 comparing against suppression specifications. The rest are purely
1279 informational (but often important). */
1280
1281typedef
1282 struct _ExeContextRec {
1283 struct _ExeContextRec * next;
1284 /* The size of this array is VG_(clo_backtrace_size); at least
1285 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1286 [1] is its caller, [2] is the caller of [1], etc. */
1287 Addr eips[0];
1288 }
1289 ExeContext;
1290
1291
1292/* Initialise the ExeContext storage mechanism. */
1293extern void VG_(init_ExeContext_storage) ( void );
1294
1295/* Print stats (informational only). */
1296extern void VG_(show_ExeContext_stats) ( void );
1297
1298
1299/* Take a snapshot of the client's stack. Search our collection of
1300 ExeContexts to see if we already have it, and if not, allocate a
1301 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001302extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1303 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001304
1305/* Print an ExeContext. */
1306extern void VG_(pp_ExeContext) ( ExeContext* );
1307
1308/* Compare two ExeContexts, just comparing the top two callers. */
1309extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1310
1311/* Compare two ExeContexts, just comparing the top four callers. */
1312extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1313
1314/* Compare two ExeContexts, comparing all callers. */
1315extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1316
1317
1318
1319/* ---------------------------------------------------------------------
1320 Exports of vg_errcontext.c.
1321 ------------------------------------------------------------------ */
1322
1323extern void VG_(load_suppressions) ( void );
1324extern void VG_(show_all_errors) ( void );
1325extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001326extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1327extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001328extern void VG_(record_address_error) ( Addr a, Int size,
1329 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001330
1331extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001332
1333extern void VG_(record_param_err) ( ThreadState* tst,
1334 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001335 Bool isWriteLack,
1336 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001337extern void VG_(record_user_err) ( ThreadState* tst,
1338 Addr a, Bool isWriteLack );
sewardj4dced352002-06-04 22:54:20 +00001339extern void VG_(record_pthread_err) ( ThreadId tid, Char* msg );
1340
sewardjde4a1d02002-03-22 01:27:54 +00001341
1342
1343/* The classification of a faulting address. */
1344typedef
sewardjb581a132002-05-08 00:32:50 +00001345 enum { Undescribed, /* as-yet unclassified */
1346 Stack,
1347 Unknown, /* classification yielded nothing useful */
1348 Freed, Mallocd,
1349 UserG, UserS }
sewardjde4a1d02002-03-22 01:27:54 +00001350 AddrKind;
1351
1352/* Records info about a faulting address. */
1353typedef
1354 struct {
1355 /* ALL */
1356 AddrKind akind;
1357 /* Freed, Mallocd */
1358 Int blksize;
1359 /* Freed, Mallocd */
1360 Int rwoffset;
1361 /* Freed, Mallocd */
1362 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001363 /* Stack */
1364 ThreadId stack_tid;
sewardjb581a132002-05-08 00:32:50 +00001365 /* True if is just-below %esp -- could be a gcc bug. */
1366 Bool maybe_gcc;
sewardjde4a1d02002-03-22 01:27:54 +00001367 }
1368 AddrInfo;
1369
1370
1371/* ---------------------------------------------------------------------
1372 Exports of vg_clientperms.c
1373 ------------------------------------------------------------------ */
1374
1375extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1376
sewardj8c824512002-04-14 04:16:48 +00001377extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001378
1379extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1380
1381extern void VG_(show_client_block_stats) ( void );
1382
1383
1384/* ---------------------------------------------------------------------
1385 Exports of vg_procselfmaps.c
1386 ------------------------------------------------------------------ */
1387
1388extern
1389void VG_(read_procselfmaps) (
1390 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1391);
1392
1393
1394/* ---------------------------------------------------------------------
1395 Exports of vg_symtab2.c
1396 ------------------------------------------------------------------ */
1397
1398/* We assume the executable is loaded here ... can't really find
1399 out. There is a hacky sanity check in vg_init_memory_audit()
1400 which should trip up most stupidities.
1401*/
1402#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1403
1404extern void VG_(read_symbols) ( void );
1405extern void VG_(mini_stack_dump) ( ExeContext* ec );
1406extern void VG_(what_obj_and_fun_is_this)
1407 ( Addr a,
1408 Char* obj_buf, Int n_obj_buf,
1409 Char* fun_buf, Int n_fun_buf );
njn4f9c9342002-04-29 16:03:24 +00001410extern Bool VG_(what_line_is_this) ( Addr a,
1411 UChar* filename, Int n_filename,
1412 UInt* lineno );
1413extern Bool VG_(what_fn_is_this) ( Bool no_demangle, Addr a,
1414 Char* fn_name, Int n_fn_name);
sewardjde4a1d02002-03-22 01:27:54 +00001415
sewardj18d75132002-05-16 11:06:21 +00001416extern Bool VG_(symtab_notify_munmap) ( Addr start, UInt length );
sewardjde4a1d02002-03-22 01:27:54 +00001417
1418
1419/* ---------------------------------------------------------------------
1420 Exports of vg_clientmalloc.c
1421 ------------------------------------------------------------------ */
1422
sewardjde4a1d02002-03-22 01:27:54 +00001423typedef
1424 enum {
1425 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001426 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001427 Vg_AllocNewVec = 2
1428 }
1429 VgAllocKind;
1430
1431/* Description of a malloc'd chunk. */
1432typedef
1433 struct _ShadowChunk {
1434 struct _ShadowChunk* next;
1435 ExeContext* where; /* where malloc'd/free'd */
1436 UInt size : 30; /* size requested. */
1437 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1438 Addr data; /* ptr to actual block. */
1439 }
1440 ShadowChunk;
1441
1442extern void VG_(clientmalloc_done) ( void );
1443extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1444extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1445
sewardj2e93c502002-04-12 11:12:52 +00001446/* These are called from the scheduler, when it intercepts a user
1447 request. */
sewardj8c824512002-04-14 04:16:48 +00001448extern void* VG_(client_malloc) ( ThreadState* tst,
1449 UInt size, VgAllocKind kind );
1450extern void* VG_(client_memalign) ( ThreadState* tst,
1451 UInt align, UInt size );
1452extern void VG_(client_free) ( ThreadState* tst,
1453 void* ptrV, VgAllocKind kind );
1454extern void* VG_(client_calloc) ( ThreadState* tst,
1455 UInt nmemb, UInt size1 );
1456extern void* VG_(client_realloc) ( ThreadState* tst,
1457 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001458
1459
1460/* ---------------------------------------------------------------------
1461 Exports of vg_main.c
1462 ------------------------------------------------------------------ */
1463
sewardjde4a1d02002-03-22 01:27:54 +00001464/* A structure used as an intermediary when passing the simulated
1465 CPU's state to some assembly fragments, particularly system calls.
1466 Stuff is copied from baseBlock to here, the assembly magic runs,
1467 and then the inverse copy is done. */
1468
1469extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1470 + 1 /* %eflags */
1471 + 1 /* %eip */
1472 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1473 ];
1474
1475/* Handy fns for doing the copy back and forth. */
1476extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1477extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1478
sewardjde4a1d02002-03-22 01:27:54 +00001479/* Called when some unhandleable client behaviour is detected.
1480 Prints a msg and aborts. */
1481extern void VG_(unimplemented) ( Char* msg );
sewardjcfc39b22002-05-08 01:58:18 +00001482extern void VG_(nvidia_moan) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001483
1484/* The stack on which Valgrind runs. We can't use the same stack as the
1485 simulatee -- that's an important design decision. */
1486extern UInt VG_(stack)[10000];
1487
1488/* Similarly, we have to ask for signals to be delivered on an
1489 alternative stack, since it is possible, although unlikely, that
1490 we'll have to run client code from inside the Valgrind-installed
1491 signal handler. If this happens it will be done by
1492 vg_deliver_signal_immediately(). */
1493extern UInt VG_(sigstack)[10000];
1494
sewardjde4a1d02002-03-22 01:27:54 +00001495/* Holds client's %esp at the point we gained control. From this the
1496 client's argc, argv and envp are deduced. */
1497extern Addr VG_(esp_at_startup);
1498extern Int VG_(client_argc);
1499extern Char** VG_(client_argv);
1500extern Char** VG_(client_envp);
1501
1502/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
sewardj3e1eb1f2002-05-18 13:14:17 +00001503 don't get traced into. Also mess up $libdir/valgrind so that our
1504 libpthread.so disappears from view. */
1505void VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) ( Char* ld_preload_str,
1506 Char* ld_library_path_str );
sewardjde4a1d02002-03-22 01:27:54 +00001507
1508/* Something of a function looking for a home ... start up GDB. This
1509 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1510 *client's* stack. This is necessary to give GDB the illusion that
1511 the client program really was running on the real cpu. */
1512extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1513
1514/* Spew out vast amounts of junk during JITting? */
1515extern Bool VG_(disassemble);
1516
1517/* 64-bit counter for the number of basic blocks done. */
1518extern ULong VG_(bbs_done);
1519/* 64-bit counter for the number of bbs to go before a debug exit. */
1520extern ULong VG_(bbs_to_go);
1521
1522/* Counts downwards in vg_run_innerloop. */
1523extern UInt VG_(dispatch_ctr);
1524
sewardjde4a1d02002-03-22 01:27:54 +00001525/* Is the client running on the simulated CPU or the real one? */
1526extern Bool VG_(running_on_simd_CPU); /* Initially False */
1527
1528/* The current LRU epoch. */
1529extern UInt VG_(current_epoch);
1530
sewardj7e87e382002-05-03 19:09:05 +00001531/* This is the ThreadId of the last thread the scheduler ran. */
1532extern ThreadId VG_(last_run_tid);
1533
sewardjde4a1d02002-03-22 01:27:54 +00001534
1535/* --- Counters, for informational purposes only. --- */
1536
1537/* Number of lookups which miss the fast tt helper. */
1538extern UInt VG_(tt_fast_misses);
1539
1540/* Counts for LRU informational messages. */
1541
1542/* Number and total o/t size of new translations this epoch. */
1543extern UInt VG_(this_epoch_in_count);
1544extern UInt VG_(this_epoch_in_osize);
1545extern UInt VG_(this_epoch_in_tsize);
1546/* Number and total o/t size of discarded translations this epoch. */
1547extern UInt VG_(this_epoch_out_count);
1548extern UInt VG_(this_epoch_out_osize);
1549extern UInt VG_(this_epoch_out_tsize);
1550/* Number and total o/t size of translations overall. */
1551extern UInt VG_(overall_in_count);
1552extern UInt VG_(overall_in_osize);
1553extern UInt VG_(overall_in_tsize);
1554/* Number and total o/t size of discards overall. */
1555extern UInt VG_(overall_out_count);
1556extern UInt VG_(overall_out_osize);
1557extern UInt VG_(overall_out_tsize);
1558
1559/* The number of LRU-clearings of TT/TC. */
1560extern UInt VG_(number_of_lrus);
1561
1562/* Counts pertaining to the register allocator. */
1563
1564/* total number of uinstrs input to reg-alloc */
1565extern UInt VG_(uinstrs_prealloc);
1566
1567/* total number of uinstrs added due to spill code */
1568extern UInt VG_(uinstrs_spill);
1569
1570/* number of bbs requiring spill code */
1571extern UInt VG_(translations_needing_spill);
1572
1573/* total of register ranks over all translations */
1574extern UInt VG_(total_reg_rank);
1575
sewardjde4a1d02002-03-22 01:27:54 +00001576/* Counts pertaining to internal sanity checking. */
1577extern UInt VG_(sanity_fast_count);
1578extern UInt VG_(sanity_slow_count);
1579
sewardj2e93c502002-04-12 11:12:52 +00001580/* Counts pertaining to the scheduler. */
1581extern UInt VG_(num_scheduling_events_MINOR);
1582extern UInt VG_(num_scheduling_events_MAJOR);
1583
sewardjde4a1d02002-03-22 01:27:54 +00001584
1585/* ---------------------------------------------------------------------
1586 Exports of vg_memory.c
1587 ------------------------------------------------------------------ */
1588
1589extern void VGM_(init_memory_audit) ( void );
1590extern Addr VGM_(curr_dataseg_end);
1591extern void VG_(show_reg_tags) ( void );
1592extern void VG_(detect_memory_leaks) ( void );
1593extern void VG_(done_prof_mem) ( void );
1594
1595/* Set permissions for an address range. Not speed-critical. */
1596extern void VGM_(make_noaccess) ( Addr a, UInt len );
1597extern void VGM_(make_writable) ( Addr a, UInt len );
1598extern void VGM_(make_readable) ( Addr a, UInt len );
1599/* Use with care! (read: use for shmat only) */
1600extern void VGM_(make_readwritable) ( Addr a, UInt len );
1601extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1602 UInt len );
1603
1604/* Check permissions for an address range. Not speed-critical. */
1605extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1606extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1607extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1608
sewardj0c3b53f2002-05-01 01:58:35 +00001609/* Sanity checks which may be done at any time. The scheduler decides
1610 when. */
1611extern void VG_(do_sanity_checks) ( Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001612/* Very cheap ... */
1613extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1614
1615/* These functions are called from generated code. */
1616extern void VG_(helperc_STOREV4) ( UInt, Addr );
1617extern void VG_(helperc_STOREV2) ( UInt, Addr );
1618extern void VG_(helperc_STOREV1) ( UInt, Addr );
1619
1620extern UInt VG_(helperc_LOADV1) ( Addr );
1621extern UInt VG_(helperc_LOADV2) ( Addr );
1622extern UInt VG_(helperc_LOADV4) ( Addr );
1623
1624extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1625extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1626extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1627
1628/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1629 space and pass the addresses and values of all addressible,
1630 defined, aligned words to notify_word. This is the basis for the
1631 leak detector. Returns the number of calls made to notify_word. */
1632UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1633
1634/* Is this address within some small distance below %ESP? Used only
1635 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001636extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001637
1638/* Nasty kludgery to deal with applications which switch stacks,
1639 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001640#define VG_PLAUSIBLE_STACK_SIZE 8000000
1641
sewardjc3bd5f52002-05-01 03:24:23 +00001642/* Needed by the pthreads implementation. */
1643#define VGM_WORD_VALID 0
1644#define VGM_WORD_INVALID 0xFFFFFFFF
1645
sewardjde4a1d02002-03-22 01:27:54 +00001646
1647/* ---------------------------------------------------------------------
1648 Exports of vg_syscall_mem.c
1649 ------------------------------------------------------------------ */
1650
sewardj2e93c502002-04-12 11:12:52 +00001651extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001652
sewardj2e93c502002-04-12 11:12:52 +00001653extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1654 Int syscallno,
1655 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001656
1657extern Bool VG_(is_kerror) ( Int res );
1658
sewardj018f7622002-05-15 21:13:39 +00001659#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1660 VG_(load_thread_state)(thread_id); \
1661 VG_(copy_baseBlock_to_m_state_static)(); \
1662 VG_(do_syscall)(); \
1663 VG_(copy_m_state_static_to_baseBlock)(); \
1664 VG_(save_thread_state)(thread_id); \
1665 VG_(threads)[thread_id].sh_eax = VGM_WORD_VALID; \
1666 result_lvalue = VG_(threads)[thread_id].m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001667
1668
1669/* ---------------------------------------------------------------------
1670 Exports of vg_transtab.c
1671 ------------------------------------------------------------------ */
1672
1673/* An entry in the translation table (TT). */
1674typedef
1675 struct {
1676 /* +0 */ Addr orig_addr;
1677 /* +4 */ Addr trans_addr;
1678 /* +8 */ UInt mru_epoch;
1679 /* +12 */ UShort orig_size;
1680 /* +14 */ UShort trans_size;
1681 }
1682 TTEntry;
1683
1684/* The number of basic blocks in an epoch (one age-step). */
1685#define VG_BBS_PER_EPOCH 20000
1686
1687extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1688extern void VG_(maybe_do_lru_pass) ( void );
1689extern void VG_(flush_transtab) ( void );
1690extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1691extern void VG_(add_to_trans_tab) ( TTEntry* tte );
sewardj18d75132002-05-16 11:06:21 +00001692extern void VG_(invalidate_translations) ( Addr start, UInt range );
sewardjde4a1d02002-03-22 01:27:54 +00001693
sewardj18d75132002-05-16 11:06:21 +00001694extern void VG_(init_tt_tc) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001695
1696extern void VG_(sanity_check_tc_tt) ( void );
1697extern Addr VG_(search_transtab) ( Addr original_addr );
1698
1699extern void VG_(invalidate_tt_fast)( void );
1700
1701
1702/* ---------------------------------------------------------------------
1703 Exports of vg_vtagops.c
1704 ------------------------------------------------------------------ */
1705
1706/* Lists the names of value-tag operations used in instrumented
1707 code. These are the third argument to TAG1 and TAG2 uinsns. */
1708
1709typedef
1710 enum {
1711 /* Unary. */
1712 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1713 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1714
1715 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1716
1717 VgT_Left4, VgT_Left2, VgT_Left1,
1718
1719 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1720 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1721
1722 /* Binary; 1st is rd; 2nd is rd+wr */
1723 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1724 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1725
1726 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1727 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1728 VgT_DebugFn
1729 }
1730 VgTagOp;
1731
1732extern Char* VG_(nameOfTagOp) ( VgTagOp );
1733extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1734
1735
1736/* ---------------------------------------------------------------------
1737 Exports of vg_syscall.S
1738 ------------------------------------------------------------------ */
1739
1740extern void VG_(do_syscall) ( void );
1741
1742
1743/* ---------------------------------------------------------------------
1744 Exports of vg_startup.S
1745 ------------------------------------------------------------------ */
1746
sewardjde4a1d02002-03-22 01:27:54 +00001747extern void VG_(switch_to_real_CPU) ( void );
1748
sewardj35805422002-04-21 13:05:34 +00001749extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1750 Addr m_esp_at_error,
1751 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001752
1753
1754/* ---------------------------------------------------------------------
1755 Exports of vg_dispatch.S
1756 ------------------------------------------------------------------ */
1757
sewardj2e93c502002-04-12 11:12:52 +00001758/* Run a thread for a (very short) while, until some event happens
1759 which means we need to defer to the scheduler. */
1760extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001761
1762
1763/* ---------------------------------------------------------------------
1764 Exports of vg_helpers.S
1765 ------------------------------------------------------------------ */
1766
sewardjde4a1d02002-03-22 01:27:54 +00001767/* Mul, div, etc, -- we don't codegen these directly. */
1768extern void VG_(helper_idiv_64_32);
1769extern void VG_(helper_div_64_32);
1770extern void VG_(helper_idiv_32_16);
1771extern void VG_(helper_div_32_16);
1772extern void VG_(helper_idiv_16_8);
1773extern void VG_(helper_div_16_8);
1774
1775extern void VG_(helper_imul_32_64);
1776extern void VG_(helper_mul_32_64);
1777extern void VG_(helper_imul_16_32);
1778extern void VG_(helper_mul_16_32);
1779extern void VG_(helper_imul_8_16);
1780extern void VG_(helper_mul_8_16);
1781
1782extern void VG_(helper_CLD);
1783extern void VG_(helper_STD);
1784extern void VG_(helper_get_dirflag);
1785
sewardj7d78e782002-06-02 00:04:00 +00001786extern void VG_(helper_CLC);
1787extern void VG_(helper_STC);
1788
sewardjde4a1d02002-03-22 01:27:54 +00001789extern void VG_(helper_shldl);
1790extern void VG_(helper_shldw);
1791extern void VG_(helper_shrdl);
1792extern void VG_(helper_shrdw);
1793
1794extern void VG_(helper_RDTSC);
1795extern void VG_(helper_CPUID);
1796
sewardjde4a1d02002-03-22 01:27:54 +00001797extern void VG_(helper_bsf);
1798extern void VG_(helper_bsr);
1799
1800extern void VG_(helper_fstsw_AX);
1801extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001802extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001803extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001804
1805extern void VG_(helper_value_check4_fail);
1806extern void VG_(helper_value_check2_fail);
1807extern void VG_(helper_value_check1_fail);
1808extern void VG_(helper_value_check0_fail);
1809
sewardj20917d82002-05-28 01:36:45 +00001810/* NOT A FUNCTION; this is a bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001811extern void VG_(signalreturn_bogusRA)( void );
sewardj20917d82002-05-28 01:36:45 +00001812
sewardj54cacf02002-04-12 23:24:59 +00001813
njn4f9c9342002-04-29 16:03:24 +00001814/* ---------------------------------------------------------------------
1815 Exports of vg_cachesim.c
1816 ------------------------------------------------------------------ */
1817
sewardj07133bf2002-06-13 10:25:56 +00001818extern Int VG_(log2) ( Int x );
njn7cf0bd32002-06-08 13:36:03 +00001819
sewardj07133bf2002-06-13 10:25:56 +00001820extern UCodeBlock* VG_(cachesim_instrument) ( UCodeBlock* cb_in,
1821 Addr orig_addr );
njn4f9c9342002-04-29 16:03:24 +00001822
1823typedef struct _iCC iCC;
1824typedef struct _idCC idCC;
1825
njn7cf0bd32002-06-08 13:36:03 +00001826extern void VG_(init_cachesim) ( void );
1827extern void VG_(do_cachesim_results)( Int client_argc, Char** client_argv );
njn4f9c9342002-04-29 16:03:24 +00001828
1829extern void VG_(cachesim_log_non_mem_instr)( iCC* cc );
1830extern void VG_(cachesim_log_mem_instr) ( idCC* cc, Addr data_addr );
sewardjde4a1d02002-03-22 01:27:54 +00001831
sewardj18d75132002-05-16 11:06:21 +00001832extern void VG_(cachesim_notify_discard) ( TTEntry* tte );
1833
1834
sewardjde4a1d02002-03-22 01:27:54 +00001835/* ---------------------------------------------------------------------
1836 The state of the simulated CPU.
1837 ------------------------------------------------------------------ */
1838
1839/* This is the Intel register encoding. */
1840#define R_EAX 0
1841#define R_ECX 1
1842#define R_EDX 2
1843#define R_EBX 3
1844#define R_ESP 4
1845#define R_EBP 5
1846#define R_ESI 6
1847#define R_EDI 7
1848
1849#define R_AL (0+R_EAX)
1850#define R_CL (0+R_ECX)
1851#define R_DL (0+R_EDX)
1852#define R_BL (0+R_EBX)
1853#define R_AH (4+R_EAX)
1854#define R_CH (4+R_ECX)
1855#define R_DH (4+R_EDX)
1856#define R_BH (4+R_EBX)
1857
1858
1859/* ---------------------------------------------------------------------
1860 Offsets into baseBlock for everything which needs to referred to
1861 from generated code. The order of these decls does not imply
1862 what the order of the actual offsets is. The latter is important
1863 and is set up in vg_main.c.
1864 ------------------------------------------------------------------ */
1865
1866/* An array of words. In generated code, %ebp always points to the
1867 start of this array. Useful stuff, like the simulated CPU state,
1868 and the addresses of helper functions, can then be found by
1869 indexing off %ebp. The following declares variables which, at
1870 startup time, are given values denoting offsets into baseBlock.
1871 These offsets are in *words* from the start of baseBlock. */
1872
1873#define VG_BASEBLOCK_WORDS 200
1874
1875extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1876
1877
1878/* -----------------------------------------------------
1879 Read-write parts of baseBlock.
1880 -------------------------------------------------- */
1881
1882/* State of the simulated CPU. */
1883extern Int VGOFF_(m_eax);
1884extern Int VGOFF_(m_ecx);
1885extern Int VGOFF_(m_edx);
1886extern Int VGOFF_(m_ebx);
1887extern Int VGOFF_(m_esp);
1888extern Int VGOFF_(m_ebp);
1889extern Int VGOFF_(m_esi);
1890extern Int VGOFF_(m_edi);
1891extern Int VGOFF_(m_eflags);
1892extern Int VGOFF_(m_fpustate);
1893extern Int VGOFF_(m_eip);
1894
1895/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1896extern Int VGOFF_(spillslots);
1897
1898/* Records the valid bits for the 8 integer regs & flags reg. */
1899extern Int VGOFF_(sh_eax);
1900extern Int VGOFF_(sh_ecx);
1901extern Int VGOFF_(sh_edx);
1902extern Int VGOFF_(sh_ebx);
1903extern Int VGOFF_(sh_esp);
1904extern Int VGOFF_(sh_ebp);
1905extern Int VGOFF_(sh_esi);
1906extern Int VGOFF_(sh_edi);
1907extern Int VGOFF_(sh_eflags);
1908
1909
1910/* -----------------------------------------------------
1911 Read-only parts of baseBlock.
1912 -------------------------------------------------- */
1913
1914/* Offsets of addresses of helper functions. A "helper" function is
1915 one which is called from generated code. */
1916
1917extern Int VGOFF_(helper_idiv_64_32);
1918extern Int VGOFF_(helper_div_64_32);
1919extern Int VGOFF_(helper_idiv_32_16);
1920extern Int VGOFF_(helper_div_32_16);
1921extern Int VGOFF_(helper_idiv_16_8);
1922extern Int VGOFF_(helper_div_16_8);
1923
1924extern Int VGOFF_(helper_imul_32_64);
1925extern Int VGOFF_(helper_mul_32_64);
1926extern Int VGOFF_(helper_imul_16_32);
1927extern Int VGOFF_(helper_mul_16_32);
1928extern Int VGOFF_(helper_imul_8_16);
1929extern Int VGOFF_(helper_mul_8_16);
1930
1931extern Int VGOFF_(helper_CLD);
1932extern Int VGOFF_(helper_STD);
1933extern Int VGOFF_(helper_get_dirflag);
1934
sewardj7d78e782002-06-02 00:04:00 +00001935extern Int VGOFF_(helper_CLC);
1936extern Int VGOFF_(helper_STC);
1937
sewardjde4a1d02002-03-22 01:27:54 +00001938extern Int VGOFF_(helper_shldl);
1939extern Int VGOFF_(helper_shldw);
1940extern Int VGOFF_(helper_shrdl);
1941extern Int VGOFF_(helper_shrdw);
1942
1943extern Int VGOFF_(helper_RDTSC);
1944extern Int VGOFF_(helper_CPUID);
1945
sewardjde4a1d02002-03-22 01:27:54 +00001946extern Int VGOFF_(helper_bsf);
1947extern Int VGOFF_(helper_bsr);
1948
1949extern Int VGOFF_(helper_fstsw_AX);
1950extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001951extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001952extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001953
1954extern Int VGOFF_(helper_value_check4_fail);
1955extern Int VGOFF_(helper_value_check2_fail);
1956extern Int VGOFF_(helper_value_check1_fail);
1957extern Int VGOFF_(helper_value_check0_fail);
1958
sewardjde4a1d02002-03-22 01:27:54 +00001959extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1960extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1961extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1962
1963extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1964extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1965extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1966
1967extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1968extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1969extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1970
njn4f9c9342002-04-29 16:03:24 +00001971extern Int VGOFF_(cachesim_log_non_mem_instr);
1972extern Int VGOFF_(cachesim_log_mem_instr);
sewardjde4a1d02002-03-22 01:27:54 +00001973
1974#endif /* ndef __VG_INCLUDE_H */
1975
sewardj3b2736a2002-03-24 12:18:35 +00001976
1977/* ---------------------------------------------------------------------
1978 Finally - autoconf-generated settings
1979 ------------------------------------------------------------------ */
1980
1981#include "config.h"
1982
sewardjde4a1d02002-03-22 01:27:54 +00001983/*--------------------------------------------------------------------*/
1984/*--- end vg_include.h ---*/
1985/*--------------------------------------------------------------------*/