blob: 290fbec7395f7c24e5120e0be08d868227b502f5 [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/* ---------------------------------------------------------------------
42 Build options and table sizes. You should be able to change these
43 options or sizes, recompile, and still have a working system.
44 ------------------------------------------------------------------ */
45
46#include "vg_constants.h"
47
48
49/* Set to 1 to enable time profiling. Since this uses SIGPROF, we
50 don't want this permanently enabled -- only for profiling
51 builds. */
52#if 0
53# define VG_PROFILE
54#endif
55
56
57/* Total number of integer registers available for allocation. That's
58 all of them except %esp, %edi and %ebp. %edi is a general spare
59 temporary. %ebp permanently points at VG_(baseBlock). Note that
60 it's important that this tie in with what rankToRealRegNo() says.
61 DO NOT CHANGE THIS VALUE FROM 5. ! */
62#define VG_MAX_REALREGS 5
63
64/* Total number of spill slots available for allocation, if a TempReg
65 doesn't make it into a RealReg. Just bomb the entire system if
66 this value is too small; we don't expect it will ever get
67 particularly high. */
68#define VG_MAX_SPILLSLOTS 24
69
70
71/* Constants for the slow translation lookup cache. */
72#define VG_TRANSTAB_SLOW_BITS 11
73#define VG_TRANSTAB_SLOW_SIZE (1 << VG_TRANSTAB_SLOW_BITS)
74#define VG_TRANSTAB_SLOW_MASK ((VG_TRANSTAB_SLOW_SIZE) - 1)
75
76/* Size of a buffer used for creating messages. */
77#define M_VG_MSGBUF 10000
78
79/* Size of a smallish table used to read /proc/self/map entries. */
sewardjebc82332002-04-24 14:44:23 +000080#define M_PROCMAP_BUF 50000
sewardjde4a1d02002-03-22 01:27:54 +000081
82/* Max length of pathname to a .so/executable file. */
83#define M_VG_LIBNAMESTR 100
84
85/* Max length of a text fragment used to construct error messages. */
86#define M_VG_ERRTXT 512
87
88/* Max length of the string copied from env var VG_ARGS at startup. */
89#define M_VG_CMDLINE_STRLEN 1000
90
91/* Max number of options for Valgrind which we can handle. */
92#define M_VG_CMDLINE_OPTS 100
93
94/* After this many different unsuppressed errors have been observed,
95 be more conservative about collecting new ones. */
96#define M_VG_COLLECT_ERRORS_SLOWLY_AFTER 50
97
98/* After this many different unsuppressed errors have been observed,
99 stop collecting errors at all, and tell the user their program is
100 evidently a steaming pile of camel dung. */
sewardj1bebcbf2002-04-24 21:24:18 +0000101#define M_VG_COLLECT_NO_ERRORS_AFTER_SHOWN 300
sewardjf2537be2002-04-24 21:03:47 +0000102
103/* After this many total errors have been observed, stop collecting
104 errors at all. Counterpart to M_VG_COLLECT_NO_ERRORS_AFTER_SHOWN. */
sewardj1bebcbf2002-04-24 21:24:18 +0000105#define M_VG_COLLECT_NO_ERRORS_AFTER_FOUND 30000
sewardjde4a1d02002-03-22 01:27:54 +0000106
107/* These many bytes below %ESP are considered addressible if we're
108 doing the --workaround-gcc296-bugs hack. */
sewardjb581a132002-05-08 00:32:50 +0000109#define VG_GCC296_BUG_STACK_SLOP 1024
sewardjde4a1d02002-03-22 01:27:54 +0000110
111/* The maximum number of calls we're prepared to save in a
112 backtrace. */
113#define VG_DEEPEST_BACKTRACE 50
114
115/* Number of lists in which we keep track of malloc'd but not free'd
116 blocks. Should be prime. */
117#define VG_N_MALLOCLISTS 997
118
119/* Number of lists in which we keep track of ExeContexts. Should be
120 prime. */
121#define VG_N_EC_LISTS /*997*/ 4999
122
sewardj2e93c502002-04-12 11:12:52 +0000123/* Defines the thread-scheduling timeslice, in terms of the number of
124 basic blocks we attempt to run each thread for. Smaller values
125 give finer interleaving but much increased scheduling overheads. */
sewardj4505b9e2002-05-28 11:27:31 +0000126#define VG_SCHEDULING_QUANTUM 50000
sewardj2e93c502002-04-12 11:12:52 +0000127
128/* The maximum number of pthreads that we support. This is
129 deliberately not very high since our implementation of some of the
sewardj5f07b662002-04-23 16:52:51 +0000130 scheduler algorithms is surely O(N) in the number of threads, since
131 that's simple, at least. And (in practice) we hope that most
sewardj2e93c502002-04-12 11:12:52 +0000132 programs do not need many threads. */
sewardj7989d0c2002-05-28 11:00:01 +0000133#define VG_N_THREADS 20
sewardj5f07b662002-04-23 16:52:51 +0000134
135/* Maximum number of pthread keys available. Again, we start low until
136 the need for a higher number presents itself. */
137#define VG_N_THREAD_KEYS 10
sewardj2e93c502002-04-12 11:12:52 +0000138
139/* Number of file descriptors that can simultaneously be waited on for
140 I/O to complete. Perhaps this should be the same as VG_N_THREADS
141 (surely a thread can't wait on more than one fd at once?. Who
142 knows.) */
143#define VG_N_WAITING_FDS 10
144
sewardjbf290b92002-05-01 02:28:01 +0000145/* Stack size for a thread. We try and check that they do not go
146 beyond it. */
147#define VG_PTHREAD_STACK_SIZE 65536
148
sewardj20917d82002-05-28 01:36:45 +0000149/* Number of entries in the semaphore-remapping table. */
150#define VG_N_SEMAPHORES 50
151
152/* Number of entries in the rwlock-remapping table. */
153#define VG_N_RWLOCKS 50
154
sewardj8ad94e12002-05-29 00:10:20 +0000155/* Number of entries in each thread's cleanup stack. */
156#define VG_N_CLEANUPSTACK 8
157
sewardjde4a1d02002-03-22 01:27:54 +0000158
159/* ---------------------------------------------------------------------
160 Basic types
161 ------------------------------------------------------------------ */
162
163typedef unsigned char UChar;
164typedef unsigned short UShort;
165typedef unsigned int UInt;
166typedef unsigned long long int ULong;
167
168typedef signed char Char;
169typedef signed short Short;
170typedef signed int Int;
171typedef signed long long int Long;
172
173typedef unsigned int Addr;
174
175typedef unsigned char Bool;
176#define False ((Bool)0)
177#define True ((Bool)1)
178
179#define mycat_wrk(aaa,bbb) aaa##bbb
180#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
181
182/* Just pray that gcc's constant folding works properly ... */
183#define BITS(bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0) \
184 ( ((bit7) << 7) | ((bit6) << 6) | ((bit5) << 5) | ((bit4) << 4) \
185 | ((bit3) << 3) | ((bit2) << 2) | ((bit1) << 1) | (bit0))
186
187
188/* ---------------------------------------------------------------------
189 Now the basic types are set up, we can haul in the kernel-interface
190 definitions.
191 ------------------------------------------------------------------ */
192
193#include "./vg_kerneliface.h"
194
195
196/* ---------------------------------------------------------------------
197 Command-line-settable options
198 ------------------------------------------------------------------ */
199
200#define VG_CLO_SMC_NONE 0
201#define VG_CLO_SMC_SOME 1
202#define VG_CLO_SMC_ALL 2
203
204#define VG_CLO_MAX_SFILES 10
205
sewardj97ced732002-03-25 00:07:36 +0000206/* Shall we V-check addrs (they are always A checked too): default: YES */
207extern Bool VG_(clo_check_addrVs);
sewardjde4a1d02002-03-22 01:27:54 +0000208/* Enquire about whether to attach to GDB at errors? default: NO */
209extern Bool VG_(clo_GDB_attach);
210/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
211extern Int VG_(sanity_level);
212/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
213extern Int VG_(clo_verbosity);
214/* Automatically attempt to demangle C++ names? default: YES */
215extern Bool VG_(clo_demangle);
216/* Do leak check at exit? default: NO */
217extern Bool VG_(clo_leak_check);
218/* In leak check, show reachable-but-not-freed blocks? default: NO */
219extern Bool VG_(clo_show_reachable);
220/* How closely should we compare ExeContexts in leak records? default: 2 */
221extern Int VG_(clo_leak_resolution);
222/* Round malloc sizes upwards to integral number of words? default:
223 NO */
224extern Bool VG_(clo_sloppy_malloc);
225/* Allow loads from partially-valid addresses? default: YES */
226extern Bool VG_(clo_partial_loads_ok);
227/* Simulate child processes? default: NO */
228extern Bool VG_(clo_trace_children);
229/* The file id on which we send all messages. default: 2 (stderr). */
230extern Int VG_(clo_logfile_fd);
231/* Max volume of the freed blocks queue. */
232extern Int VG_(clo_freelist_vol);
233/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
234 default: NO */
235extern Bool VG_(clo_workaround_gcc296_bugs);
236
237/* The number of suppression files specified. */
238extern Int VG_(clo_n_suppressions);
239/* The names of the suppression files. */
240extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
241
242/* Single stepping? default: NO */
243extern Bool VG_(clo_single_step);
244/* Code improvement? default: YES */
245extern Bool VG_(clo_optimise);
246/* Memory-check instrumentation? default: YES */
247extern Bool VG_(clo_instrument);
248/* DEBUG: clean up instrumented code? default: YES */
249extern Bool VG_(clo_cleanup);
njn4f9c9342002-04-29 16:03:24 +0000250/* Cache simulation instrumentation? default: NO */
251extern Bool VG_(clo_cachesim);
sewardjde4a1d02002-03-22 01:27:54 +0000252/* SMC write checks? default: SOME (1,2,4 byte movs to mem) */
253extern Int VG_(clo_smc_check);
254/* DEBUG: print system calls? default: NO */
255extern Bool VG_(clo_trace_syscalls);
256/* DEBUG: print signal details? default: NO */
257extern Bool VG_(clo_trace_signals);
258/* DEBUG: print symtab details? default: NO */
259extern Bool VG_(clo_trace_symtab);
260/* DEBUG: print malloc details? default: NO */
261extern Bool VG_(clo_trace_malloc);
sewardj8937c812002-04-12 20:12:20 +0000262/* DEBUG: print thread scheduling events? default: NO */
263extern Bool VG_(clo_trace_sched);
sewardj45b4b372002-04-16 22:50:32 +0000264/* DEBUG: print pthread (mutex etc) events? default: 0 (none), 1
265 (some), 2 (all) */
266extern Int VG_(clo_trace_pthread_level);
sewardjde4a1d02002-03-22 01:27:54 +0000267/* Stop after this many basic blocks. default: Infinity. */
268extern ULong VG_(clo_stop_after);
269/* Display gory details for the k'th most popular error. default:
270 Infinity. */
271extern Int VG_(clo_dump_error);
272/* Number of parents of a backtrace. Default: 8. */
273extern Int VG_(clo_backtrace_size);
sewardj3984b852002-05-12 03:00:17 +0000274/* Engage miscellaneous wierd hacks needed for some progs. */
sewardj8d365b52002-05-12 10:52:16 +0000275extern Char* VG_(clo_weird_hacks);
sewardjde4a1d02002-03-22 01:27:54 +0000276
277
278/* ---------------------------------------------------------------------
279 Debugging and profiling stuff
280 ------------------------------------------------------------------ */
281
282/* No, really. I _am_ that strange. */
283#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
284
285/* Tools for building messages from multiple parts. */
286typedef
287 enum { Vg_UserMsg, Vg_DebugMsg, Vg_DebugExtraMsg }
288 VgMsgKind;
289
290extern void VG_(start_msg) ( VgMsgKind kind );
291extern void VG_(add_to_msg) ( Char* format, ... );
292extern void VG_(end_msg) ( void );
293
294/* Send a simple, single-part message. */
295extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
296
297/* Create a logfile into which messages can be dumped. */
298extern void VG_(startup_logging) ( void );
299extern void VG_(shutdown_logging) ( void );
300
301
302/* Profiling stuff */
303#ifdef VG_PROFILE
304
305#define VGP_M_STACK 10
306
sewardj671ff542002-05-07 09:25:30 +0000307#define VGP_M_CCS 26 /* == the # of elems in VGP_LIST */
sewardjde4a1d02002-03-22 01:27:54 +0000308#define VGP_LIST \
sewardj671ff542002-05-07 09:25:30 +0000309 VGP_PAIR(VgpUnc=0, "unclassified"), \
310 VGP_PAIR(VgpRun, "running"), \
311 VGP_PAIR(VgpSched, "scheduler"), \
sewardjde4a1d02002-03-22 01:27:54 +0000312 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
313 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
314 VGP_PAIR(VgpTranslate, "translate-main"), \
315 VGP_PAIR(VgpToUCode, "to-ucode"), \
316 VGP_PAIR(VgpFromUcode, "from-ucode"), \
317 VGP_PAIR(VgpImprove, "improve"), \
318 VGP_PAIR(VgpInstrument, "instrument"), \
319 VGP_PAIR(VgpCleanup, "cleanup"), \
320 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
321 VGP_PAIR(VgpDoLRU, "do-lru"), \
322 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
323 VGP_PAIR(VgpInitAudit, "init-mem-audit"), \
324 VGP_PAIR(VgpExeContext, "exe-context"), \
325 VGP_PAIR(VgpReadSyms, "read-syms"), \
326 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
327 VGP_PAIR(VgpSARP, "set-addr-range-perms"), \
328 VGP_PAIR(VgpSyscall, "syscall wrapper"), \
njn4f9c9342002-04-29 16:03:24 +0000329 VGP_PAIR(VgpCacheInstrument, "cache instrument"), \
330 VGP_PAIR(VgpCacheGetBBCC,"cache get BBCC"), \
331 VGP_PAIR(VgpCacheSimulate, "cache simulate"), \
332 VGP_PAIR(VgpCacheDump, "cache stats dump"), \
sewardjde4a1d02002-03-22 01:27:54 +0000333 VGP_PAIR(VgpSpare1, "spare 1"), \
334 VGP_PAIR(VgpSpare2, "spare 2")
335
336#define VGP_PAIR(enumname,str) enumname
337typedef enum { VGP_LIST } VgpCC;
338#undef VGP_PAIR
339
340extern void VGP_(init_profiling) ( void );
341extern void VGP_(done_profiling) ( void );
342extern void VGP_(pushcc) ( VgpCC );
343extern void VGP_(popcc) ( void );
344
345#define VGP_PUSHCC(cc) VGP_(pushcc)(cc)
346#define VGP_POPCC VGP_(popcc)()
347
348#else
349
350#define VGP_PUSHCC(cc) /* */
351#define VGP_POPCC /* */
352
353#endif /* VG_PROFILE */
354
355
356/* ---------------------------------------------------------------------
357 Exports of vg_malloc2.c
358 ------------------------------------------------------------------ */
359
360/* Allocation arenas.
361 SYMTAB is for Valgrind's symbol table storage.
362 CLIENT is for the client's mallocs/frees.
363 DEMANGLE is for the C++ demangler.
364 EXECTXT is for storing ExeContexts.
365 ERRCTXT is for storing ErrContexts.
366 PRIVATE is for Valgrind general stuff.
367 TRANSIENT is for very short-term use. It should be empty
368 in between uses.
369 When adding a new arena, remember also to add it
370 to ensure_mm_init().
371*/
372typedef Int ArenaId;
373
374#define VG_N_ARENAS 7
375
376#define VG_AR_PRIVATE 0 /* :: ArenaId */
377#define VG_AR_SYMTAB 1 /* :: ArenaId */
378#define VG_AR_CLIENT 2 /* :: ArenaId */
379#define VG_AR_DEMANGLE 3 /* :: ArenaId */
380#define VG_AR_EXECTXT 4 /* :: ArenaId */
381#define VG_AR_ERRCTXT 5 /* :: ArenaId */
382#define VG_AR_TRANSIENT 6 /* :: ArenaId */
383
384extern void* VG_(malloc) ( ArenaId arena, Int nbytes );
385extern void VG_(free) ( ArenaId arena, void* ptr );
386extern void* VG_(calloc) ( ArenaId arena, Int nmemb, Int nbytes );
387extern void* VG_(realloc) ( ArenaId arena, void* ptr, Int size );
388extern void* VG_(malloc_aligned) ( ArenaId aid, Int req_alignB,
389 Int req_pszB );
390
391extern void VG_(mallocSanityCheckArena) ( ArenaId arena );
392extern void VG_(mallocSanityCheckAll) ( void );
393
394extern void VG_(show_all_arena_stats) ( void );
395extern Bool VG_(is_empty_arena) ( ArenaId aid );
396
397
398/* The red-zone size for the client. This can be arbitrary, but
399 unfortunately must be set at compile time. */
400#define VG_AR_CLIENT_REDZONE_SZW 4
401
402#define VG_AR_CLIENT_REDZONE_SZB \
403 (VG_AR_CLIENT_REDZONE_SZW * VKI_BYTES_PER_WORD)
404
405
406/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000407 Exports of vg_clientfuns.c
408 ------------------------------------------------------------------ */
409
410/* This doesn't export code or data that valgrind.so needs to link
411 against. However, the scheduler does need to know the following
412 request codes. A few, publically-visible, request codes are also
413 defined in valgrind.h. */
414
415#define VG_USERREQ__MALLOC 0x2001
416#define VG_USERREQ__BUILTIN_NEW 0x2002
417#define VG_USERREQ__BUILTIN_VEC_NEW 0x2003
418
419#define VG_USERREQ__FREE 0x2004
420#define VG_USERREQ__BUILTIN_DELETE 0x2005
421#define VG_USERREQ__BUILTIN_VEC_DELETE 0x2006
422
423#define VG_USERREQ__CALLOC 0x2007
424#define VG_USERREQ__REALLOC 0x2008
425#define VG_USERREQ__MEMALIGN 0x2009
426
427
sewardj20917d82002-05-28 01:36:45 +0000428/* (Fn, Arg): Create a new thread and run Fn applied to Arg in it. Fn
429 MUST NOT return -- ever. Eventually it will do either __QUIT or
430 __WAIT_JOINER. */
431#define VG_USERREQ__APPLY_IN_NEW_THREAD 0x3001
432
433/* ( no-args ): calling thread disappears from the system forever.
434 Reclaim resources. */
435#define VG_USERREQ__QUIT 0x3002
436
437/* ( void* ): calling thread waits for joiner and returns the void* to
438 it. */
439#define VG_USERREQ__WAIT_JOINER 0x3003
440
441/* ( ThreadId, void** ): wait to join a thread. */
442#define VG_USERREQ__PTHREAD_JOIN 0x3004
443
444/* Set cancellation state and type for this thread. */
445#define VG_USERREQ__SET_CANCELSTATE 0x3005
446#define VG_USERREQ__SET_CANCELTYPE 0x3006
447
448/* ( no-args ): Test if we are at a cancellation point. */
449#define VG_USERREQ__TESTCANCEL 0x3007
450
451/* ( ThreadId, &thread_exit_wrapper is the only allowable arg ): call
452 with this arg to indicate that a cancel is now pending for the
453 specified thread. */
454#define VG_USERREQ__SET_CANCELPEND 0x3008
455
456/* Set/get detach state for this thread. */
457#define VG_USERREQ__SET_OR_GET_DETACH 0x3009
458
459#define VG_USERREQ__PTHREAD_GET_THREADID 0x300B
460#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x300C
461#define VG_USERREQ__PTHREAD_MUTEX_TRYLOCK 0x300D
462#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x300E
463#define VG_USERREQ__PTHREAD_COND_WAIT 0x300F
464#define VG_USERREQ__PTHREAD_COND_TIMEDWAIT 0x3010
465#define VG_USERREQ__PTHREAD_COND_SIGNAL 0x3011
466#define VG_USERREQ__PTHREAD_COND_BROADCAST 0x3012
467#define VG_USERREQ__PTHREAD_KEY_CREATE 0x3013
468#define VG_USERREQ__PTHREAD_KEY_DELETE 0x3014
469#define VG_USERREQ__PTHREAD_SETSPECIFIC 0x3015
470#define VG_USERREQ__PTHREAD_GETSPECIFIC 0x3016
471#define VG_USERREQ__READ_MILLISECOND_TIMER 0x3017
472#define VG_USERREQ__PTHREAD_SIGMASK 0x3018
473#define VG_USERREQ__SIGWAIT 0x3019
474#define VG_USERREQ__PTHREAD_KILL 0x301A
475#define VG_USERREQ__PTHREAD_YIELD 0x301B
sewardj2e93c502002-04-12 11:12:52 +0000476
sewardj8ad94e12002-05-29 00:10:20 +0000477#define VG_USERREQ__CLEANUP_PUSH 0x3020
478#define VG_USERREQ__CLEANUP_POP 0x3021
sewardj870497a2002-05-29 01:06:47 +0000479#define VG_USERREQ__GET_KEY_D_AND_S 0x3022
sewardj8ad94e12002-05-29 00:10:20 +0000480
sewardj45b4b372002-04-16 22:50:32 +0000481/* Cosmetic ... */
482#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
483
sewardj54cacf02002-04-12 23:24:59 +0000484/*
485In vg_constants.h:
486#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardj54cacf02002-04-12 23:24:59 +0000487*/
488
489
sewardj2e93c502002-04-12 11:12:52 +0000490/* ---------------------------------------------------------------------
491 Constants pertaining to the simulated CPU state, VG_(baseBlock),
492 which need to go here to avoid ugly circularities.
493 ------------------------------------------------------------------ */
494
495/* How big is the saved FPU state? */
496#define VG_SIZE_OF_FPUSTATE 108
497/* ... and in words ... */
498#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
499
500
501/* ---------------------------------------------------------------------
502 Exports of vg_scheduler.c
503 ------------------------------------------------------------------ */
504
505/* ThreadIds are simply indices into the vg_threads[] array. */
506typedef
507 UInt
508 ThreadId;
509
sewardj6072c362002-04-19 14:40:57 +0000510/* Special magic value for an invalid ThreadId. It corresponds to
511 LinuxThreads using zero as the initial value for
512 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
513#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000514
515typedef
516 enum {
517 VgTs_Empty, /* this slot is not in use */
518 VgTs_Runnable, /* waiting to be scheduled */
519 VgTs_WaitJoiner, /* waiting for someone to do join on me */
520 VgTs_WaitJoinee, /* waiting for the thread I did join on */
521 VgTs_WaitFD, /* waiting for I/O completion on a fd */
522 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000523 VgTs_WaitCV, /* waiting on a condition variable */
sewardjb48e5002002-05-13 00:16:03 +0000524 VgTs_WaitSIG, /* waiting due to sigwait() */
sewardj2e93c502002-04-12 11:12:52 +0000525 VgTs_Sleeping /* sleeping for a while */
526 }
527 ThreadStatus;
sewardj8ad94e12002-05-29 00:10:20 +0000528
529/* An entry in a threads's cleanup stack. */
530typedef
531 struct {
532 void (*fn)(void*);
533 void* arg;
534 }
535 CleanupEntry;
sewardj2e93c502002-04-12 11:12:52 +0000536
537typedef
538 struct {
sewardj6072c362002-04-19 14:40:57 +0000539 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
540 The thread identity is simply the index in vg_threads[].
541 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000542 that we don't try and allocate or deallocate its stack. For
543 convenience of generating error message, we also put the
544 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000545 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000546 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000547
sewardj5f07b662002-04-23 16:52:51 +0000548 /* Current scheduling status.
549
550 Complications: whenever this is set to VgTs_WaitMX, you
551 should also set .m_edx to whatever the required return value
552 is for pthread_mutex_lock / pthread_cond_timedwait for when
553 the mutex finally gets unblocked. */
sewardj2e93c502002-04-12 11:12:52 +0000554 ThreadStatus status;
555
sewardj3b5d8862002-04-20 13:53:23 +0000556 /* When .status == WaitMX, points to the mutex I am waiting for.
557 When .status == WaitCV, points to the mutex associated with
558 the condition variable indicated by the .associated_cv field.
559 In all other cases, should be NULL. */
560 void* /* pthread_mutex_t* */ associated_mx;
561
562 /* When .status == WaitCV, points to the condition variable I am
563 waiting for. In all other cases, should be NULL. */
564 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000565
sewardj5f07b662002-04-23 16:52:51 +0000566 /* If VgTs_Sleeping, this is when we should wake up, measured in
567 milliseconds as supplied by VG_(read_millisecond_counter).
568
569 If VgTs_WaitCV, this indicates the time at which
570 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
571 this means infinitely far in the future, viz,
572 pthread_cond_wait. */
573 UInt awaken_at;
sewardj2e93c502002-04-12 11:12:52 +0000574
sewardj20917d82002-05-28 01:36:45 +0000575 /* If VgTs_WaitJoiner, return value, as generated by joinees. */
576 void* joinee_retval;
577
578 /* If VgTs_WaitJoinee, place to copy the return value to, and
579 the identity of the thread we're waiting for. */
580 void** joiner_thread_return;
581 ThreadId joiner_jee_tid;
582
sewardj8ad94e12002-05-29 00:10:20 +0000583 /* Whether or not detached. */
584 Bool detached;
585
sewardj20917d82002-05-28 01:36:45 +0000586 /* Cancelability state and type. */
587 Bool cancel_st; /* False==PTH_CANCEL_DISABLE; True==.._ENABLE */
588 Bool cancel_ty; /* False==PTH_CANC_ASYNCH; True==..._DEFERRED */
589
590 /* Pointer to fn to call to do cancellation. Indicates whether
591 or not cancellation is pending. If NULL, not pending. Else
592 should be &thread_exit_wrapper(), indicating that
593 cancallation is pending. */
594 void (*cancel_pend)(void*);
595
sewardj8ad94e12002-05-29 00:10:20 +0000596 /* The cleanup stack. */
597 Int custack_used;
598 CleanupEntry custack[VG_N_CLEANUPSTACK];
sewardj2e93c502002-04-12 11:12:52 +0000599
sewardj5f07b662002-04-23 16:52:51 +0000600 /* thread-specific data */
601 void* specifics[VG_N_THREAD_KEYS];
602
sewardjb48e5002002-05-13 00:16:03 +0000603 /* This thread's blocked-signals mask. Semantics is that for a
604 signal to be delivered to this thread, the signal must not be
605 blocked by either the process-wide signal mask nor by this
606 one. So, if this thread is prepared to handle any signal that
607 the process as a whole is prepared to handle, this mask should
608 be made empty -- and that it is its default, starting
609 state. */
610 vki_ksigset_t sig_mask;
611
612 /* When not VgTs_WaitSIG, has no meaning. When VgTs_WaitSIG,
613 is the set of signals for which we are sigwait()ing. */
614 vki_ksigset_t sigs_waited_for;
615
sewardj2e93c502002-04-12 11:12:52 +0000616 /* Stacks. When a thread slot is freed, we don't deallocate its
617 stack; we just leave it lying around for the next use of the
618 slot. If the next use of the slot requires a larger stack,
619 only then is the old one deallocated and a new one
620 allocated.
621
622 For the main thread (threadid == 0), this mechanism doesn't
623 apply. We don't know the size of the stack since we didn't
624 allocate it, and furthermore we never reallocate it. */
625
626 /* The allocated size of this thread's stack (permanently zero
627 if this is ThreadId == 0, since we didn't allocate its stack) */
628 UInt stack_size;
629
630 /* Address of the lowest word in this thread's stack. NULL means
631 not allocated yet.
632 */
633 Addr stack_base;
634
sewardj1e8cdc92002-04-18 11:37:52 +0000635 /* Address of the highest legitimate word in this stack. This is
636 used for error messages only -- not critical for execution
637 correctness. Is is set for all stacks, specifically including
638 ThreadId == 0 (the main thread). */
639 Addr stack_highest_word;
640
sewardj2e93c502002-04-12 11:12:52 +0000641 /* Saved machine context. */
642 UInt m_eax;
643 UInt m_ebx;
644 UInt m_ecx;
645 UInt m_edx;
646 UInt m_esi;
647 UInt m_edi;
648 UInt m_ebp;
649 UInt m_esp;
650 UInt m_eflags;
651 UInt m_eip;
652 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
653
654 UInt sh_eax;
655 UInt sh_ebx;
656 UInt sh_ecx;
657 UInt sh_edx;
658 UInt sh_esi;
659 UInt sh_edi;
660 UInt sh_ebp;
661 UInt sh_esp;
662 UInt sh_eflags;
663 }
664 ThreadState;
665
666
sewardj018f7622002-05-15 21:13:39 +0000667/* The thread table. */
668extern ThreadState VG_(threads)[VG_N_THREADS];
669
670/* Check that tid is in range and denotes a non-Empty thread. */
sewardjb48e5002002-05-13 00:16:03 +0000671extern Bool VG_(is_valid_tid) ( ThreadId tid );
672
sewardj018f7622002-05-15 21:13:39 +0000673/* Check that tid is in range. */
674extern Bool VG_(is_valid_or_empty_tid) ( ThreadId tid );
675
sewardj2e93c502002-04-12 11:12:52 +0000676/* Copy the specified thread's state into VG_(baseBlock) in
677 preparation for running it. */
678extern void VG_(load_thread_state)( ThreadId );
679
680/* Save the specified thread's state back in VG_(baseBlock), and fill
681 VG_(baseBlock) with junk, for sanity-check reasons. */
682extern void VG_(save_thread_state)( ThreadId );
683
sewardj1e8cdc92002-04-18 11:37:52 +0000684/* And for the currently running one, if valid. */
685extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000686
sewardj1e8cdc92002-04-18 11:37:52 +0000687/* Similarly ... */
688extern ThreadId VG_(get_current_tid) ( void );
689
690/* Which thread is this address in the stack of, if any? Used for
691 error message generation. */
692extern ThreadId VG_(identify_stack_addr)( Addr a );
693
sewardj2e93c502002-04-12 11:12:52 +0000694
695/* Return codes from the scheduler. */
696typedef
sewardj7e87e382002-05-03 19:09:05 +0000697 enum {
698 VgSrc_Deadlock, /* no runnable threads and no prospect of any
699 even if we wait for a long time */
700 VgSrc_ExitSyscall, /* client called exit(). This is the normal
701 route out. */
702 VgSrc_BbsDone /* In a debugging run, the specified number of
703 bbs has been completed. */
704 }
sewardj2e93c502002-04-12 11:12:52 +0000705 VgSchedReturnCode;
706
sewardj7e87e382002-05-03 19:09:05 +0000707
sewardj2e93c502002-04-12 11:12:52 +0000708/* The scheduler. */
709extern VgSchedReturnCode VG_(scheduler) ( void );
710
711extern void VG_(scheduler_init) ( void );
712
sewardj15a43e12002-04-17 19:35:12 +0000713extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000714
715/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
716extern jmp_buf VG_(scheduler_jmpbuf);
717/* ... and if so, here's the signal which caused it to do so. */
718extern Int VG_(longjmpd_on_signal);
719
720
sewardja1679dd2002-05-10 22:31:40 +0000721/* Possible places where the main stack might be based. We check that
722 the initial stack, which we can't move, is allocated here.
723 VG_(scheduler_init) checks this. Andrea Archelangi's 2.4 kernels
724 have been rumoured to start stacks at 0x80000000, so that too is
725 considered.
sewardj2e93c502002-04-12 11:12:52 +0000726*/
sewardja1679dd2002-05-10 22:31:40 +0000727#define VG_STARTUP_STACK_BASE_1 (Addr)0xC0000000
728#define VG_STARTUP_STACK_BASE_2 (Addr)0x80000000
729#define VG_STARTUP_STACK_SMALLERTHAN 0x100000 /* 1024k */
730
731#define VG_STACK_MATCHES_BASE(zzstack, zzbase) \
732 ( \
733 ((zzstack) & ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN)) \
734 == \
735 ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN) \
736 )
sewardj2e93c502002-04-12 11:12:52 +0000737
738
739/* The red-zone size which we put at the bottom (highest address) of
740 thread stacks, for paranoia reasons. This can be arbitrary, and
741 doesn't really need to be set at compile time. */
742#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
743
744#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
745 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
746
747
sewardj018f7622002-05-15 21:13:39 +0000748/* Write a value to the client's %EDX (request return value register)
749 and set the shadow to indicate it is defined. */
750#define SET_EDX(zztid, zzval) \
751 do { VG_(threads)[zztid].m_edx = (zzval); \
752 VG_(threads)[zztid].sh_edx = VGM_WORD_VALID; \
753 } while (0)
754
755#define SET_EAX(zztid, zzval) \
756 do { VG_(threads)[zztid].m_eax = (zzval); \
757 VG_(threads)[zztid].sh_eax = VGM_WORD_VALID; \
758 } while (0)
759
sewardj2e93c502002-04-12 11:12:52 +0000760
761/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000762 Exports of vg_signals.c
763 ------------------------------------------------------------------ */
764
sewardjde4a1d02002-03-22 01:27:54 +0000765extern void VG_(sigstartup_actions) ( void );
766
sewardjb48e5002002-05-13 00:16:03 +0000767extern Bool VG_(deliver_signals) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000768extern void VG_(unblock_host_signal) ( Int sigNo );
sewardj018f7622002-05-15 21:13:39 +0000769extern void VG_(handle_SCSS_change) ( Bool force_update );
770
sewardjde4a1d02002-03-22 01:27:54 +0000771
772/* Fake system calls for signal handling. */
sewardj2342c972002-05-22 23:34:20 +0000773extern void VG_(do__NR_sigaltstack) ( ThreadId tid );
sewardj2e93c502002-04-12 11:12:52 +0000774extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardj018f7622002-05-15 21:13:39 +0000775extern void VG_(do__NR_sigprocmask) ( ThreadId tid,
776 Int how,
777 vki_ksigset_t* set,
778 vki_ksigset_t* oldset );
779extern void VG_(do_pthread_sigmask_SCSS_upd) ( ThreadId tid,
780 Int how,
781 vki_ksigset_t* set,
782 vki_ksigset_t* oldset );
783extern void VG_(send_signal_to_thread) ( ThreadId thread,
784 Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000785
sewardj2e93c502002-04-12 11:12:52 +0000786/* Modify the current thread's state once we have detected it is
787 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000788extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000789
sewardj2e93c502002-04-12 11:12:52 +0000790/* Handy utilities to block/restore all host signals. */
791extern void VG_(block_all_host_signals)
792 ( /* OUT */ vki_ksigset_t* saved_mask );
sewardj018f7622002-05-15 21:13:39 +0000793extern void VG_(restore_all_host_signals)
sewardj2e93c502002-04-12 11:12:52 +0000794 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000795
796/* ---------------------------------------------------------------------
797 Exports of vg_mylibc.c
798 ------------------------------------------------------------------ */
799
800
sewardjfbe18b92002-05-10 00:46:59 +0000801#if !defined(NULL)
802# define NULL ((void*)0)
803#endif
sewardjde4a1d02002-03-22 01:27:54 +0000804
805extern void VG_(exit)( Int status )
806 __attribute__ ((__noreturn__));
807
808extern void VG_(printf) ( const char *format, ... );
809/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
810
811extern void VG_(sprintf) ( Char* buf, Char *format, ... );
812
813extern void VG_(vprintf) ( void(*send)(Char),
814 const Char *format, va_list vargs );
815
816extern Bool VG_(isspace) ( Char c );
817
818extern Int VG_(strlen) ( const Char* str );
819
820extern Long VG_(atoll) ( Char* str );
821
822extern Char* VG_(strcat) ( Char* dest, const Char* src );
823extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
824extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
825
826extern Char* VG_(strcpy) ( Char* dest, const Char* src );
827
828extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
829extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
830
831extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
832extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
833
834extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
835extern Char* VG_(strchr) ( const Char* s, Char c );
836extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
837
838extern Char* VG_(getenv) ( Char* name );
839extern Int VG_(getpid) ( void );
sewardj5f07b662002-04-23 16:52:51 +0000840
841extern void VG_(start_rdtsc_calibration) ( void );
842extern void VG_(end_rdtsc_calibration) ( void );
843extern UInt VG_(read_millisecond_timer) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000844
845
846extern Char VG_(toupper) ( Char c );
847
848extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
849
850extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
851
852extern Bool VG_(stringMatch) ( Char* pat, Char* str );
853
854
sewardj3e1eb1f2002-05-18 13:14:17 +0000855#define VG__STRING(__str) #__str
sewardjde4a1d02002-03-22 01:27:54 +0000856
857/* Asserts are permanently enabled. Hurrah! */
858#define vg_assert(expr) \
859 ((void) ((expr) ? 0 : \
sewardj3e1eb1f2002-05-18 13:14:17 +0000860 (VG_(assert_fail) (VG__STRING(expr), \
sewardjde4a1d02002-03-22 01:27:54 +0000861 __FILE__, __LINE__, \
862 __PRETTY_FUNCTION__), 0)))
863
864extern void VG_(assert_fail) ( Char* expr, Char* file,
865 Int line, Char* fn )
866 __attribute__ ((__noreturn__));
867
njn4f9c9342002-04-29 16:03:24 +0000868/* Reading and writing files. */
sewardjde4a1d02002-03-22 01:27:54 +0000869extern Int VG_(open_read) ( Char* pathname );
njn4f9c9342002-04-29 16:03:24 +0000870extern Int VG_(open_write) ( Char* pathname );
871extern Int VG_(create_and_write) ( Char* pathname );
sewardjde4a1d02002-03-22 01:27:54 +0000872extern void VG_(close) ( Int fd );
873extern Int VG_(read) ( Int fd, void* buf, Int count);
874extern Int VG_(write) ( Int fd, void* buf, Int count);
sewardjb3586202002-05-09 17:38:13 +0000875extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
sewardjde4a1d02002-03-22 01:27:54 +0000876
sewardj2e93c502002-04-12 11:12:52 +0000877extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
878
879extern Int VG_(select)( Int n,
880 vki_fd_set* readfds,
881 vki_fd_set* writefds,
882 vki_fd_set* exceptfds,
883 struct vki_timeval * timeout );
884extern Int VG_(nanosleep)( const struct vki_timespec *req,
885 struct vki_timespec *rem );
886
887
sewardjde4a1d02002-03-22 01:27:54 +0000888/* mmap-ery ... */
889extern void* VG_(mmap)( void* start, UInt length,
890 UInt prot, UInt flags, UInt fd, UInt offset );
891
sewardj2e93c502002-04-12 11:12:52 +0000892extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000893
sewardjb3586202002-05-09 17:38:13 +0000894extern void* VG_(brk) ( void* end_data_segment );
895
sewardjde4a1d02002-03-22 01:27:54 +0000896
897/* Print a (panic) message, and abort. */
898extern void VG_(panic) ( Char* str )
899 __attribute__ ((__noreturn__));
900
901/* Get memory by anonymous mmap. */
sewardje6a25242002-04-21 22:03:07 +0000902extern void* VG_(get_memory_from_mmap) ( Int nBytes );
903
904/* Crude stand-in for the glibc system() call. */
905extern Int VG_(system) ( Char* cmd );
906
sewardjde4a1d02002-03-22 01:27:54 +0000907
908/* Signal stuff. Note that these use the vk_ (kernel) structure
909 definitions, which are different in places from those that glibc
910 defines. Since we're operating right at the kernel interface,
911 glibc's view of the world is entirely irrelevant. */
sewardj018f7622002-05-15 21:13:39 +0000912
913/* --- Signal set ops --- */
sewardjb48e5002002-05-13 00:16:03 +0000914extern Int VG_(ksigfillset)( vki_ksigset_t* set );
915extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
sewardjde4a1d02002-03-22 01:27:54 +0000916
sewardj018f7622002-05-15 21:13:39 +0000917extern Bool VG_(kisfullsigset)( vki_ksigset_t* set );
918extern Bool VG_(kisemptysigset)( vki_ksigset_t* set );
919
920extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
921extern Int VG_(ksigdelset)( vki_ksigset_t* set, Int signum );
922extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
923
sewardjb48e5002002-05-13 00:16:03 +0000924extern void VG_(ksigaddset_from_set)( vki_ksigset_t* dst,
925 vki_ksigset_t* src );
926extern void VG_(ksigdelset_from_set)( vki_ksigset_t* dst,
927 vki_ksigset_t* src );
928
sewardj018f7622002-05-15 21:13:39 +0000929/* --- Mess with the kernel's sig state --- */
930extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
931 vki_ksigset_t* oldset );
932extern Int VG_(ksigaction) ( Int signum,
933 const vki_ksigaction* act,
934 vki_ksigaction* oldact );
sewardjde4a1d02002-03-22 01:27:54 +0000935
936extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
937
938extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
939
sewardj018f7622002-05-15 21:13:39 +0000940extern Int VG_(kill)( Int pid, Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000941
942
943/* ---------------------------------------------------------------------
944 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
945 vg_from_ucode.c).
946 ------------------------------------------------------------------ */
947
948/* Tags which describe what operands are. */
949typedef
950 enum { TempReg=0, ArchReg=1, RealReg=2,
951 SpillNo=3, Literal=4, Lit16=5,
952 NoValue=6 }
953 Tag;
954
955
956/* Microinstruction opcodes. */
957typedef
958 enum {
959 NOP,
960 GET,
961 PUT,
962 LOAD,
963 STORE,
964 MOV,
965 CMOV, /* Used for cmpxchg and cmov */
966 WIDEN,
967 JMP,
968
969 /* Read/write the %EFLAGS register into a TempReg. */
970 GETF, PUTF,
971
972 ADD, ADC, AND, OR, XOR, SUB, SBB,
973 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
974 NOT, NEG, INC, DEC, BSWAP,
975 CC2VAL,
976
977 /* Not strictly needed, but useful for making better
978 translations of address calculations. */
979 LEA1, /* reg2 := const + reg1 */
980 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
981
982 /* not for translating x86 calls -- only to call helpers */
983 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
984 for CALLM. */
985 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
986 CALLM, /* call to a machine-code helper */
987
988 /* Hack for translating string (REP-) insns. Jump to literal if
989 TempReg/RealReg is zero. */
990 JIFZ,
991
992 /* FPU ops which read/write mem or don't touch mem at all. */
993 FPU_R,
994 FPU_W,
995 FPU,
996
997 /* Advance the simulated %eip by some small (< 128) number. */
998 INCEIP,
999
1000 /* uinstrs which are not needed for mere translation of x86 code,
1001 only for instrumentation of it. */
1002 LOADV,
1003 STOREV,
1004 GETV,
1005 PUTV,
1006 TESTV,
1007 SETV,
1008 /* Get/set the v-bit (and it is only one bit) for the simulated
1009 %eflags register. */
1010 GETVF,
1011 PUTVF,
1012
1013 /* Do a unary or binary tag op. Only for post-instrumented
1014 code. For TAG1, first and only arg is a TempReg, and is both
1015 arg and result reg. For TAG2, first arg is src, second is
1016 dst, in the normal way; both are TempRegs. In both cases,
1017 3rd arg is a RiCHelper with a Lit16 tag. This indicates
1018 which tag op to do. */
1019 TAG1,
1020 TAG2
1021 }
1022 Opcode;
1023
1024
1025/* Condition codes, observing the Intel encoding. CondAlways is an
1026 extra. */
1027typedef
1028 enum {
1029 CondO = 0, /* overflow */
1030 CondNO = 1, /* no overflow */
1031 CondB = 2, /* below */
1032 CondNB = 3, /* not below */
1033 CondZ = 4, /* zero */
1034 CondNZ = 5, /* not zero */
1035 CondBE = 6, /* below or equal */
1036 CondNBE = 7, /* not below or equal */
1037 CondS = 8, /* negative */
1038 ConsNS = 9, /* not negative */
1039 CondP = 10, /* parity even */
1040 CondNP = 11, /* not parity even */
1041 CondL = 12, /* jump less */
1042 CondNL = 13, /* not less */
1043 CondLE = 14, /* less or equal */
1044 CondNLE = 15, /* not less or equal */
1045 CondAlways = 16 /* Jump always */
1046 }
1047 Condcode;
1048
1049
sewardj2e93c502002-04-12 11:12:52 +00001050/* Descriptions of additional properties of *unconditional* jumps. */
1051typedef
1052 enum {
1053 JmpBoring=0, /* boring unconditional jump */
1054 JmpCall=1, /* jump due to an x86 call insn */
1055 JmpRet=2, /* jump due to an x86 ret insn */
1056 JmpSyscall=3, /* do a system call, then jump */
1057 JmpClientReq=4 /* do a client request, then jump */
1058 }
1059 JmpKind;
1060
1061
sewardjde4a1d02002-03-22 01:27:54 +00001062/* Flags. User-level code can only read/write O(verflow), S(ign),
1063 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
1064 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
1065 thusly:
1066 76543210
1067 DOSZACP
1068 and bit 7 must always be zero since it is unused.
1069*/
1070typedef UChar FlagSet;
1071
1072#define FlagD (1<<6)
1073#define FlagO (1<<5)
1074#define FlagS (1<<4)
1075#define FlagZ (1<<3)
1076#define FlagA (1<<2)
1077#define FlagC (1<<1)
1078#define FlagP (1<<0)
1079
1080#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
1081#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
1082#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
1083#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
1084#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
1085#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +00001086#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +00001087#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +00001088#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +00001089
1090#define FlagsALL (FlagsOSZACP | FlagD)
1091#define FlagsEmpty (FlagSet)0
1092
1093#define VG_IS_FLAG_SUBSET(set1,set2) \
1094 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
1095
1096#define VG_UNION_FLAG_SETS(set1,set2) \
1097 ( ((FlagSet)set1) | ((FlagSet)set2) )
1098
1099
1100
1101/* A Micro (u)-instruction. */
1102typedef
1103 struct {
1104 /* word 1 */
1105 UInt lit32; /* 32-bit literal */
1106
1107 /* word 2 */
1108 UShort val1; /* first operand */
1109 UShort val2; /* second operand */
1110
1111 /* word 3 */
1112 UShort val3; /* third operand */
1113 UChar opcode; /* opcode */
1114 UChar size; /* data transfer size */
1115
1116 /* word 4 */
1117 FlagSet flags_r; /* :: FlagSet */
1118 FlagSet flags_w; /* :: FlagSet */
1119 UChar tag1:4; /* first operand tag */
1120 UChar tag2:4; /* second operand tag */
1121 UChar tag3:4; /* third operand tag */
1122 UChar extra4b:4; /* Spare field, used by WIDEN for src
1123 -size, and by LEA2 for scale
njn4f9c9342002-04-29 16:03:24 +00001124 (1,2,4 or 8), and by unconditional JMPs for
1125 orig x86 instr size if --cachesim=yes */
1126
sewardjde4a1d02002-03-22 01:27:54 +00001127
1128 /* word 5 */
1129 UChar cond; /* condition, for jumps */
1130 Bool smc_check:1; /* do a smc test, if writes memory. */
1131 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +00001132 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +00001133 }
1134 UInstr;
1135
1136
1137/* Expandable arrays of uinstrs. */
1138typedef
1139 struct {
1140 Int used;
1141 Int size;
1142 UInstr* instrs;
1143 Int nextTemp;
1144 }
1145 UCodeBlock;
1146
1147/* Refer to `the last instruction stuffed in', including as an
1148 lvalue. */
1149#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1150
1151/* An invalid temporary number :-) */
1152#define INVALID_TEMPREG 999999999
1153
1154
1155/* ---------------------------------------------------------------------
1156 Exports of vg_demangle.c
1157 ------------------------------------------------------------------ */
1158
1159extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
1160
1161
1162/* ---------------------------------------------------------------------
1163 Exports of vg_from_ucode.c
1164 ------------------------------------------------------------------ */
1165
1166extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
1167
1168
1169/* ---------------------------------------------------------------------
1170 Exports of vg_to_ucode.c
1171 ------------------------------------------------------------------ */
1172
1173extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
1174extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
1175extern Char VG_(nameOfIntSize) ( Int size );
1176extern UInt VG_(extend_s_8to32) ( UInt x );
1177extern Int VG_(getNewTemp) ( UCodeBlock* cb );
1178extern Int VG_(getNewShadow) ( UCodeBlock* cb );
1179
1180#define SHADOW(tempreg) ((tempreg)+1)
1181
1182
1183/* ---------------------------------------------------------------------
1184 Exports of vg_translate.c
1185 ------------------------------------------------------------------ */
1186
sewardj1e8cdc92002-04-18 11:37:52 +00001187extern void VG_(translate) ( ThreadState* tst,
1188 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001189 UInt* orig_size,
1190 Addr* trans_addr,
1191 UInt* trans_size );
1192
1193extern void VG_(emptyUInstr) ( UInstr* u );
1194extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1195extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
1196 Tag tag1, UInt val1 );
1197extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
1198 Tag tag1, UInt val1,
1199 Tag tag2, UInt val2 );
1200extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
1201 Tag tag1, UInt val1,
1202 Tag tag2, UInt val2,
1203 Tag tag3, UInt val3 );
1204extern void VG_(setFlagRW) ( UInstr* u,
1205 FlagSet fr, FlagSet fw );
1206
1207extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1208extern Bool VG_(anyFlagUse) ( UInstr* u );
1209
1210
1211
1212extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1213extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1214
njn4f9c9342002-04-29 16:03:24 +00001215extern UCodeBlock* VG_(allocCodeBlock) ( void );
1216extern void VG_(freeCodeBlock) ( UCodeBlock* cb );
1217extern void VG_(copyUInstr) ( UCodeBlock* cb, UInstr* instr );
1218
sewardjde4a1d02002-03-22 01:27:54 +00001219extern Char* VG_(nameCondcode) ( Condcode cond );
1220extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1221extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1222extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1223extern Int VG_(rankToRealRegNo) ( Int rank );
1224
1225extern void* VG_(jitmalloc) ( Int nbytes );
1226extern void VG_(jitfree) ( void* ptr );
1227
1228
1229/* ---------------------------------------------------------------------
1230 Exports of vg_execontext.c.
1231 ------------------------------------------------------------------ */
1232
1233/* Records the PC and a bit of the call chain. The first 4 %eip
1234 values are used in comparisons do remove duplicate errors, and for
1235 comparing against suppression specifications. The rest are purely
1236 informational (but often important). */
1237
1238typedef
1239 struct _ExeContextRec {
1240 struct _ExeContextRec * next;
1241 /* The size of this array is VG_(clo_backtrace_size); at least
1242 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1243 [1] is its caller, [2] is the caller of [1], etc. */
1244 Addr eips[0];
1245 }
1246 ExeContext;
1247
1248
1249/* Initialise the ExeContext storage mechanism. */
1250extern void VG_(init_ExeContext_storage) ( void );
1251
1252/* Print stats (informational only). */
1253extern void VG_(show_ExeContext_stats) ( void );
1254
1255
1256/* Take a snapshot of the client's stack. Search our collection of
1257 ExeContexts to see if we already have it, and if not, allocate a
1258 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001259extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1260 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001261
1262/* Print an ExeContext. */
1263extern void VG_(pp_ExeContext) ( ExeContext* );
1264
1265/* Compare two ExeContexts, just comparing the top two callers. */
1266extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1267
1268/* Compare two ExeContexts, just comparing the top four callers. */
1269extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1270
1271/* Compare two ExeContexts, comparing all callers. */
1272extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1273
1274
1275
1276/* ---------------------------------------------------------------------
1277 Exports of vg_errcontext.c.
1278 ------------------------------------------------------------------ */
1279
1280extern void VG_(load_suppressions) ( void );
1281extern void VG_(show_all_errors) ( void );
1282extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001283extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1284extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001285extern void VG_(record_address_error) ( Addr a, Int size,
1286 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001287
1288extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001289
1290extern void VG_(record_param_err) ( ThreadState* tst,
1291 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001292 Bool isWriteLack,
1293 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001294extern void VG_(record_user_err) ( ThreadState* tst,
1295 Addr a, Bool isWriteLack );
sewardjde4a1d02002-03-22 01:27:54 +00001296
1297
1298/* The classification of a faulting address. */
1299typedef
sewardjb581a132002-05-08 00:32:50 +00001300 enum { Undescribed, /* as-yet unclassified */
1301 Stack,
1302 Unknown, /* classification yielded nothing useful */
1303 Freed, Mallocd,
1304 UserG, UserS }
sewardjde4a1d02002-03-22 01:27:54 +00001305 AddrKind;
1306
1307/* Records info about a faulting address. */
1308typedef
1309 struct {
1310 /* ALL */
1311 AddrKind akind;
1312 /* Freed, Mallocd */
1313 Int blksize;
1314 /* Freed, Mallocd */
1315 Int rwoffset;
1316 /* Freed, Mallocd */
1317 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001318 /* Stack */
1319 ThreadId stack_tid;
sewardjb581a132002-05-08 00:32:50 +00001320 /* True if is just-below %esp -- could be a gcc bug. */
1321 Bool maybe_gcc;
sewardjde4a1d02002-03-22 01:27:54 +00001322 }
1323 AddrInfo;
1324
1325
1326/* ---------------------------------------------------------------------
1327 Exports of vg_clientperms.c
1328 ------------------------------------------------------------------ */
1329
1330extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1331
sewardj8c824512002-04-14 04:16:48 +00001332extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001333
1334extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1335
1336extern void VG_(show_client_block_stats) ( void );
1337
1338
1339/* ---------------------------------------------------------------------
1340 Exports of vg_procselfmaps.c
1341 ------------------------------------------------------------------ */
1342
1343extern
1344void VG_(read_procselfmaps) (
1345 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1346);
1347
1348
1349/* ---------------------------------------------------------------------
1350 Exports of vg_symtab2.c
1351 ------------------------------------------------------------------ */
1352
1353/* We assume the executable is loaded here ... can't really find
1354 out. There is a hacky sanity check in vg_init_memory_audit()
1355 which should trip up most stupidities.
1356*/
1357#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1358
1359extern void VG_(read_symbols) ( void );
1360extern void VG_(mini_stack_dump) ( ExeContext* ec );
1361extern void VG_(what_obj_and_fun_is_this)
1362 ( Addr a,
1363 Char* obj_buf, Int n_obj_buf,
1364 Char* fun_buf, Int n_fun_buf );
njn4f9c9342002-04-29 16:03:24 +00001365extern Bool VG_(what_line_is_this) ( Addr a,
1366 UChar* filename, Int n_filename,
1367 UInt* lineno );
1368extern Bool VG_(what_fn_is_this) ( Bool no_demangle, Addr a,
1369 Char* fn_name, Int n_fn_name);
sewardjde4a1d02002-03-22 01:27:54 +00001370
sewardj18d75132002-05-16 11:06:21 +00001371extern Bool VG_(symtab_notify_munmap) ( Addr start, UInt length );
sewardjde4a1d02002-03-22 01:27:54 +00001372
1373
1374/* ---------------------------------------------------------------------
1375 Exports of vg_clientmalloc.c
1376 ------------------------------------------------------------------ */
1377
sewardjde4a1d02002-03-22 01:27:54 +00001378typedef
1379 enum {
1380 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001381 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001382 Vg_AllocNewVec = 2
1383 }
1384 VgAllocKind;
1385
1386/* Description of a malloc'd chunk. */
1387typedef
1388 struct _ShadowChunk {
1389 struct _ShadowChunk* next;
1390 ExeContext* where; /* where malloc'd/free'd */
1391 UInt size : 30; /* size requested. */
1392 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1393 Addr data; /* ptr to actual block. */
1394 }
1395 ShadowChunk;
1396
1397extern void VG_(clientmalloc_done) ( void );
1398extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1399extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1400
sewardj2e93c502002-04-12 11:12:52 +00001401/* These are called from the scheduler, when it intercepts a user
1402 request. */
sewardj8c824512002-04-14 04:16:48 +00001403extern void* VG_(client_malloc) ( ThreadState* tst,
1404 UInt size, VgAllocKind kind );
1405extern void* VG_(client_memalign) ( ThreadState* tst,
1406 UInt align, UInt size );
1407extern void VG_(client_free) ( ThreadState* tst,
1408 void* ptrV, VgAllocKind kind );
1409extern void* VG_(client_calloc) ( ThreadState* tst,
1410 UInt nmemb, UInt size1 );
1411extern void* VG_(client_realloc) ( ThreadState* tst,
1412 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001413
1414
1415/* ---------------------------------------------------------------------
1416 Exports of vg_main.c
1417 ------------------------------------------------------------------ */
1418
sewardjde4a1d02002-03-22 01:27:54 +00001419/* A structure used as an intermediary when passing the simulated
1420 CPU's state to some assembly fragments, particularly system calls.
1421 Stuff is copied from baseBlock to here, the assembly magic runs,
1422 and then the inverse copy is done. */
1423
1424extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1425 + 1 /* %eflags */
1426 + 1 /* %eip */
1427 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1428 ];
1429
1430/* Handy fns for doing the copy back and forth. */
1431extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1432extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1433
sewardjde4a1d02002-03-22 01:27:54 +00001434/* Called when some unhandleable client behaviour is detected.
1435 Prints a msg and aborts. */
1436extern void VG_(unimplemented) ( Char* msg );
sewardjcfc39b22002-05-08 01:58:18 +00001437extern void VG_(nvidia_moan) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001438
1439/* The stack on which Valgrind runs. We can't use the same stack as the
1440 simulatee -- that's an important design decision. */
1441extern UInt VG_(stack)[10000];
1442
1443/* Similarly, we have to ask for signals to be delivered on an
1444 alternative stack, since it is possible, although unlikely, that
1445 we'll have to run client code from inside the Valgrind-installed
1446 signal handler. If this happens it will be done by
1447 vg_deliver_signal_immediately(). */
1448extern UInt VG_(sigstack)[10000];
1449
sewardjde4a1d02002-03-22 01:27:54 +00001450/* Holds client's %esp at the point we gained control. From this the
1451 client's argc, argv and envp are deduced. */
1452extern Addr VG_(esp_at_startup);
1453extern Int VG_(client_argc);
1454extern Char** VG_(client_argv);
1455extern Char** VG_(client_envp);
1456
1457/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
sewardj3e1eb1f2002-05-18 13:14:17 +00001458 don't get traced into. Also mess up $libdir/valgrind so that our
1459 libpthread.so disappears from view. */
1460void VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) ( Char* ld_preload_str,
1461 Char* ld_library_path_str );
sewardjde4a1d02002-03-22 01:27:54 +00001462
1463/* Something of a function looking for a home ... start up GDB. This
1464 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1465 *client's* stack. This is necessary to give GDB the illusion that
1466 the client program really was running on the real cpu. */
1467extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1468
1469/* Spew out vast amounts of junk during JITting? */
1470extern Bool VG_(disassemble);
1471
1472/* 64-bit counter for the number of basic blocks done. */
1473extern ULong VG_(bbs_done);
1474/* 64-bit counter for the number of bbs to go before a debug exit. */
1475extern ULong VG_(bbs_to_go);
1476
1477/* Counts downwards in vg_run_innerloop. */
1478extern UInt VG_(dispatch_ctr);
1479
sewardjde4a1d02002-03-22 01:27:54 +00001480/* Is the client running on the simulated CPU or the real one? */
1481extern Bool VG_(running_on_simd_CPU); /* Initially False */
1482
1483/* The current LRU epoch. */
1484extern UInt VG_(current_epoch);
1485
sewardj7e87e382002-05-03 19:09:05 +00001486/* This is the ThreadId of the last thread the scheduler ran. */
1487extern ThreadId VG_(last_run_tid);
1488
sewardjde4a1d02002-03-22 01:27:54 +00001489
1490/* --- Counters, for informational purposes only. --- */
1491
1492/* Number of lookups which miss the fast tt helper. */
1493extern UInt VG_(tt_fast_misses);
1494
1495/* Counts for LRU informational messages. */
1496
1497/* Number and total o/t size of new translations this epoch. */
1498extern UInt VG_(this_epoch_in_count);
1499extern UInt VG_(this_epoch_in_osize);
1500extern UInt VG_(this_epoch_in_tsize);
1501/* Number and total o/t size of discarded translations this epoch. */
1502extern UInt VG_(this_epoch_out_count);
1503extern UInt VG_(this_epoch_out_osize);
1504extern UInt VG_(this_epoch_out_tsize);
1505/* Number and total o/t size of translations overall. */
1506extern UInt VG_(overall_in_count);
1507extern UInt VG_(overall_in_osize);
1508extern UInt VG_(overall_in_tsize);
1509/* Number and total o/t size of discards overall. */
1510extern UInt VG_(overall_out_count);
1511extern UInt VG_(overall_out_osize);
1512extern UInt VG_(overall_out_tsize);
1513
1514/* The number of LRU-clearings of TT/TC. */
1515extern UInt VG_(number_of_lrus);
1516
1517/* Counts pertaining to the register allocator. */
1518
1519/* total number of uinstrs input to reg-alloc */
1520extern UInt VG_(uinstrs_prealloc);
1521
1522/* total number of uinstrs added due to spill code */
1523extern UInt VG_(uinstrs_spill);
1524
1525/* number of bbs requiring spill code */
1526extern UInt VG_(translations_needing_spill);
1527
1528/* total of register ranks over all translations */
1529extern UInt VG_(total_reg_rank);
1530
sewardjde4a1d02002-03-22 01:27:54 +00001531/* Counts pertaining to internal sanity checking. */
1532extern UInt VG_(sanity_fast_count);
1533extern UInt VG_(sanity_slow_count);
1534
sewardj2e93c502002-04-12 11:12:52 +00001535/* Counts pertaining to the scheduler. */
1536extern UInt VG_(num_scheduling_events_MINOR);
1537extern UInt VG_(num_scheduling_events_MAJOR);
1538
sewardjde4a1d02002-03-22 01:27:54 +00001539
1540/* ---------------------------------------------------------------------
1541 Exports of vg_memory.c
1542 ------------------------------------------------------------------ */
1543
1544extern void VGM_(init_memory_audit) ( void );
1545extern Addr VGM_(curr_dataseg_end);
1546extern void VG_(show_reg_tags) ( void );
1547extern void VG_(detect_memory_leaks) ( void );
1548extern void VG_(done_prof_mem) ( void );
1549
1550/* Set permissions for an address range. Not speed-critical. */
1551extern void VGM_(make_noaccess) ( Addr a, UInt len );
1552extern void VGM_(make_writable) ( Addr a, UInt len );
1553extern void VGM_(make_readable) ( Addr a, UInt len );
1554/* Use with care! (read: use for shmat only) */
1555extern void VGM_(make_readwritable) ( Addr a, UInt len );
1556extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1557 UInt len );
1558
1559/* Check permissions for an address range. Not speed-critical. */
1560extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1561extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1562extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1563
sewardj0c3b53f2002-05-01 01:58:35 +00001564/* Sanity checks which may be done at any time. The scheduler decides
1565 when. */
1566extern void VG_(do_sanity_checks) ( Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001567/* Very cheap ... */
1568extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1569
1570/* These functions are called from generated code. */
1571extern void VG_(helperc_STOREV4) ( UInt, Addr );
1572extern void VG_(helperc_STOREV2) ( UInt, Addr );
1573extern void VG_(helperc_STOREV1) ( UInt, Addr );
1574
1575extern UInt VG_(helperc_LOADV1) ( Addr );
1576extern UInt VG_(helperc_LOADV2) ( Addr );
1577extern UInt VG_(helperc_LOADV4) ( Addr );
1578
1579extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1580extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1581extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1582
1583/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1584 space and pass the addresses and values of all addressible,
1585 defined, aligned words to notify_word. This is the basis for the
1586 leak detector. Returns the number of calls made to notify_word. */
1587UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1588
1589/* Is this address within some small distance below %ESP? Used only
1590 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001591extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001592
1593/* Nasty kludgery to deal with applications which switch stacks,
1594 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001595#define VG_PLAUSIBLE_STACK_SIZE 8000000
1596
sewardjc3bd5f52002-05-01 03:24:23 +00001597/* Needed by the pthreads implementation. */
1598#define VGM_WORD_VALID 0
1599#define VGM_WORD_INVALID 0xFFFFFFFF
1600
sewardjde4a1d02002-03-22 01:27:54 +00001601
1602/* ---------------------------------------------------------------------
1603 Exports of vg_syscall_mem.c
1604 ------------------------------------------------------------------ */
1605
sewardj2e93c502002-04-12 11:12:52 +00001606extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001607
sewardj2e93c502002-04-12 11:12:52 +00001608extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1609 Int syscallno,
1610 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001611
1612extern Bool VG_(is_kerror) ( Int res );
1613
sewardj018f7622002-05-15 21:13:39 +00001614#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1615 VG_(load_thread_state)(thread_id); \
1616 VG_(copy_baseBlock_to_m_state_static)(); \
1617 VG_(do_syscall)(); \
1618 VG_(copy_m_state_static_to_baseBlock)(); \
1619 VG_(save_thread_state)(thread_id); \
1620 VG_(threads)[thread_id].sh_eax = VGM_WORD_VALID; \
1621 result_lvalue = VG_(threads)[thread_id].m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001622
1623
1624/* ---------------------------------------------------------------------
1625 Exports of vg_transtab.c
1626 ------------------------------------------------------------------ */
1627
1628/* An entry in the translation table (TT). */
1629typedef
1630 struct {
1631 /* +0 */ Addr orig_addr;
1632 /* +4 */ Addr trans_addr;
1633 /* +8 */ UInt mru_epoch;
1634 /* +12 */ UShort orig_size;
1635 /* +14 */ UShort trans_size;
1636 }
1637 TTEntry;
1638
1639/* The number of basic blocks in an epoch (one age-step). */
1640#define VG_BBS_PER_EPOCH 20000
1641
1642extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1643extern void VG_(maybe_do_lru_pass) ( void );
1644extern void VG_(flush_transtab) ( void );
1645extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1646extern void VG_(add_to_trans_tab) ( TTEntry* tte );
sewardj18d75132002-05-16 11:06:21 +00001647extern void VG_(invalidate_translations) ( Addr start, UInt range );
sewardjde4a1d02002-03-22 01:27:54 +00001648
sewardj18d75132002-05-16 11:06:21 +00001649extern void VG_(init_tt_tc) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001650
1651extern void VG_(sanity_check_tc_tt) ( void );
1652extern Addr VG_(search_transtab) ( Addr original_addr );
1653
1654extern void VG_(invalidate_tt_fast)( void );
1655
1656
1657/* ---------------------------------------------------------------------
1658 Exports of vg_vtagops.c
1659 ------------------------------------------------------------------ */
1660
1661/* Lists the names of value-tag operations used in instrumented
1662 code. These are the third argument to TAG1 and TAG2 uinsns. */
1663
1664typedef
1665 enum {
1666 /* Unary. */
1667 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1668 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1669
1670 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1671
1672 VgT_Left4, VgT_Left2, VgT_Left1,
1673
1674 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1675 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1676
1677 /* Binary; 1st is rd; 2nd is rd+wr */
1678 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1679 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1680
1681 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1682 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1683 VgT_DebugFn
1684 }
1685 VgTagOp;
1686
1687extern Char* VG_(nameOfTagOp) ( VgTagOp );
1688extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1689
1690
1691/* ---------------------------------------------------------------------
1692 Exports of vg_syscall.S
1693 ------------------------------------------------------------------ */
1694
1695extern void VG_(do_syscall) ( void );
1696
1697
1698/* ---------------------------------------------------------------------
1699 Exports of vg_startup.S
1700 ------------------------------------------------------------------ */
1701
sewardjde4a1d02002-03-22 01:27:54 +00001702extern void VG_(switch_to_real_CPU) ( void );
1703
sewardj35805422002-04-21 13:05:34 +00001704extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1705 Addr m_esp_at_error,
1706 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001707
1708
1709/* ---------------------------------------------------------------------
1710 Exports of vg_dispatch.S
1711 ------------------------------------------------------------------ */
1712
sewardj2e93c502002-04-12 11:12:52 +00001713/* Run a thread for a (very short) while, until some event happens
1714 which means we need to defer to the scheduler. */
1715extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001716
1717
1718/* ---------------------------------------------------------------------
1719 Exports of vg_helpers.S
1720 ------------------------------------------------------------------ */
1721
sewardjde4a1d02002-03-22 01:27:54 +00001722/* Mul, div, etc, -- we don't codegen these directly. */
1723extern void VG_(helper_idiv_64_32);
1724extern void VG_(helper_div_64_32);
1725extern void VG_(helper_idiv_32_16);
1726extern void VG_(helper_div_32_16);
1727extern void VG_(helper_idiv_16_8);
1728extern void VG_(helper_div_16_8);
1729
1730extern void VG_(helper_imul_32_64);
1731extern void VG_(helper_mul_32_64);
1732extern void VG_(helper_imul_16_32);
1733extern void VG_(helper_mul_16_32);
1734extern void VG_(helper_imul_8_16);
1735extern void VG_(helper_mul_8_16);
1736
1737extern void VG_(helper_CLD);
1738extern void VG_(helper_STD);
1739extern void VG_(helper_get_dirflag);
1740
1741extern void VG_(helper_shldl);
1742extern void VG_(helper_shldw);
1743extern void VG_(helper_shrdl);
1744extern void VG_(helper_shrdw);
1745
1746extern void VG_(helper_RDTSC);
1747extern void VG_(helper_CPUID);
1748
sewardjde4a1d02002-03-22 01:27:54 +00001749extern void VG_(helper_bsf);
1750extern void VG_(helper_bsr);
1751
1752extern void VG_(helper_fstsw_AX);
1753extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001754extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001755extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001756
1757extern void VG_(helper_value_check4_fail);
1758extern void VG_(helper_value_check2_fail);
1759extern void VG_(helper_value_check1_fail);
1760extern void VG_(helper_value_check0_fail);
1761
sewardj20917d82002-05-28 01:36:45 +00001762/* NOT A FUNCTION; this is a bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001763extern void VG_(signalreturn_bogusRA)( void );
sewardj20917d82002-05-28 01:36:45 +00001764
sewardj54cacf02002-04-12 23:24:59 +00001765
njn4f9c9342002-04-29 16:03:24 +00001766/* ---------------------------------------------------------------------
1767 Exports of vg_cachesim.c
1768 ------------------------------------------------------------------ */
1769
1770extern UCodeBlock* VG_(cachesim_instrument)(UCodeBlock* cb_in, Addr orig_addr);
1771
1772typedef struct _iCC iCC;
1773typedef struct _idCC idCC;
1774
1775extern void VG_(init_cachesim) ( void );
1776extern void VG_(show_cachesim_results)( Int client_argc, Char** client_argv );
1777
1778extern void VG_(cachesim_log_non_mem_instr)( iCC* cc );
1779extern void VG_(cachesim_log_mem_instr) ( idCC* cc, Addr data_addr );
sewardjde4a1d02002-03-22 01:27:54 +00001780
sewardj18d75132002-05-16 11:06:21 +00001781extern void VG_(cachesim_notify_discard) ( TTEntry* tte );
1782
1783
sewardjde4a1d02002-03-22 01:27:54 +00001784/* ---------------------------------------------------------------------
1785 The state of the simulated CPU.
1786 ------------------------------------------------------------------ */
1787
1788/* This is the Intel register encoding. */
1789#define R_EAX 0
1790#define R_ECX 1
1791#define R_EDX 2
1792#define R_EBX 3
1793#define R_ESP 4
1794#define R_EBP 5
1795#define R_ESI 6
1796#define R_EDI 7
1797
1798#define R_AL (0+R_EAX)
1799#define R_CL (0+R_ECX)
1800#define R_DL (0+R_EDX)
1801#define R_BL (0+R_EBX)
1802#define R_AH (4+R_EAX)
1803#define R_CH (4+R_ECX)
1804#define R_DH (4+R_EDX)
1805#define R_BH (4+R_EBX)
1806
1807
1808/* ---------------------------------------------------------------------
1809 Offsets into baseBlock for everything which needs to referred to
1810 from generated code. The order of these decls does not imply
1811 what the order of the actual offsets is. The latter is important
1812 and is set up in vg_main.c.
1813 ------------------------------------------------------------------ */
1814
1815/* An array of words. In generated code, %ebp always points to the
1816 start of this array. Useful stuff, like the simulated CPU state,
1817 and the addresses of helper functions, can then be found by
1818 indexing off %ebp. The following declares variables which, at
1819 startup time, are given values denoting offsets into baseBlock.
1820 These offsets are in *words* from the start of baseBlock. */
1821
1822#define VG_BASEBLOCK_WORDS 200
1823
1824extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1825
1826
1827/* -----------------------------------------------------
1828 Read-write parts of baseBlock.
1829 -------------------------------------------------- */
1830
1831/* State of the simulated CPU. */
1832extern Int VGOFF_(m_eax);
1833extern Int VGOFF_(m_ecx);
1834extern Int VGOFF_(m_edx);
1835extern Int VGOFF_(m_ebx);
1836extern Int VGOFF_(m_esp);
1837extern Int VGOFF_(m_ebp);
1838extern Int VGOFF_(m_esi);
1839extern Int VGOFF_(m_edi);
1840extern Int VGOFF_(m_eflags);
1841extern Int VGOFF_(m_fpustate);
1842extern Int VGOFF_(m_eip);
1843
1844/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1845extern Int VGOFF_(spillslots);
1846
1847/* Records the valid bits for the 8 integer regs & flags reg. */
1848extern Int VGOFF_(sh_eax);
1849extern Int VGOFF_(sh_ecx);
1850extern Int VGOFF_(sh_edx);
1851extern Int VGOFF_(sh_ebx);
1852extern Int VGOFF_(sh_esp);
1853extern Int VGOFF_(sh_ebp);
1854extern Int VGOFF_(sh_esi);
1855extern Int VGOFF_(sh_edi);
1856extern Int VGOFF_(sh_eflags);
1857
1858
1859/* -----------------------------------------------------
1860 Read-only parts of baseBlock.
1861 -------------------------------------------------- */
1862
1863/* Offsets of addresses of helper functions. A "helper" function is
1864 one which is called from generated code. */
1865
1866extern Int VGOFF_(helper_idiv_64_32);
1867extern Int VGOFF_(helper_div_64_32);
1868extern Int VGOFF_(helper_idiv_32_16);
1869extern Int VGOFF_(helper_div_32_16);
1870extern Int VGOFF_(helper_idiv_16_8);
1871extern Int VGOFF_(helper_div_16_8);
1872
1873extern Int VGOFF_(helper_imul_32_64);
1874extern Int VGOFF_(helper_mul_32_64);
1875extern Int VGOFF_(helper_imul_16_32);
1876extern Int VGOFF_(helper_mul_16_32);
1877extern Int VGOFF_(helper_imul_8_16);
1878extern Int VGOFF_(helper_mul_8_16);
1879
1880extern Int VGOFF_(helper_CLD);
1881extern Int VGOFF_(helper_STD);
1882extern Int VGOFF_(helper_get_dirflag);
1883
1884extern Int VGOFF_(helper_shldl);
1885extern Int VGOFF_(helper_shldw);
1886extern Int VGOFF_(helper_shrdl);
1887extern Int VGOFF_(helper_shrdw);
1888
1889extern Int VGOFF_(helper_RDTSC);
1890extern Int VGOFF_(helper_CPUID);
1891
sewardjde4a1d02002-03-22 01:27:54 +00001892extern Int VGOFF_(helper_bsf);
1893extern Int VGOFF_(helper_bsr);
1894
1895extern Int VGOFF_(helper_fstsw_AX);
1896extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001897extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001898extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001899
1900extern Int VGOFF_(helper_value_check4_fail);
1901extern Int VGOFF_(helper_value_check2_fail);
1902extern Int VGOFF_(helper_value_check1_fail);
1903extern Int VGOFF_(helper_value_check0_fail);
1904
sewardjde4a1d02002-03-22 01:27:54 +00001905extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1906extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1907extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1908
1909extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1910extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1911extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1912
1913extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1914extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1915extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1916
njn4f9c9342002-04-29 16:03:24 +00001917extern Int VGOFF_(cachesim_log_non_mem_instr);
1918extern Int VGOFF_(cachesim_log_mem_instr);
sewardjde4a1d02002-03-22 01:27:54 +00001919
1920#endif /* ndef __VG_INCLUDE_H */
1921
sewardj3b2736a2002-03-24 12:18:35 +00001922
1923/* ---------------------------------------------------------------------
1924 Finally - autoconf-generated settings
1925 ------------------------------------------------------------------ */
1926
1927#include "config.h"
1928
sewardjde4a1d02002-03-22 01:27:54 +00001929/*--------------------------------------------------------------------*/
1930/*--- end vg_include.h ---*/
1931/*--------------------------------------------------------------------*/