blob: 6a078f631c4d8fa3924fb9c085b2b7799d900971 [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
479
sewardj45b4b372002-04-16 22:50:32 +0000480/* Cosmetic ... */
481#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
482
sewardj54cacf02002-04-12 23:24:59 +0000483/*
484In vg_constants.h:
485#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardj54cacf02002-04-12 23:24:59 +0000486*/
487
488
sewardj2e93c502002-04-12 11:12:52 +0000489/* ---------------------------------------------------------------------
490 Constants pertaining to the simulated CPU state, VG_(baseBlock),
491 which need to go here to avoid ugly circularities.
492 ------------------------------------------------------------------ */
493
494/* How big is the saved FPU state? */
495#define VG_SIZE_OF_FPUSTATE 108
496/* ... and in words ... */
497#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
498
499
500/* ---------------------------------------------------------------------
501 Exports of vg_scheduler.c
502 ------------------------------------------------------------------ */
503
504/* ThreadIds are simply indices into the vg_threads[] array. */
505typedef
506 UInt
507 ThreadId;
508
sewardj6072c362002-04-19 14:40:57 +0000509/* Special magic value for an invalid ThreadId. It corresponds to
510 LinuxThreads using zero as the initial value for
511 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
512#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000513
514typedef
515 enum {
516 VgTs_Empty, /* this slot is not in use */
517 VgTs_Runnable, /* waiting to be scheduled */
518 VgTs_WaitJoiner, /* waiting for someone to do join on me */
519 VgTs_WaitJoinee, /* waiting for the thread I did join on */
520 VgTs_WaitFD, /* waiting for I/O completion on a fd */
521 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000522 VgTs_WaitCV, /* waiting on a condition variable */
sewardjb48e5002002-05-13 00:16:03 +0000523 VgTs_WaitSIG, /* waiting due to sigwait() */
sewardj2e93c502002-04-12 11:12:52 +0000524 VgTs_Sleeping /* sleeping for a while */
525 }
526 ThreadStatus;
sewardj8ad94e12002-05-29 00:10:20 +0000527
528/* An entry in a threads's cleanup stack. */
529typedef
530 struct {
531 void (*fn)(void*);
532 void* arg;
533 }
534 CleanupEntry;
sewardj2e93c502002-04-12 11:12:52 +0000535
536typedef
537 struct {
sewardj6072c362002-04-19 14:40:57 +0000538 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
539 The thread identity is simply the index in vg_threads[].
540 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000541 that we don't try and allocate or deallocate its stack. For
542 convenience of generating error message, we also put the
543 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000544 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000545 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000546
sewardj5f07b662002-04-23 16:52:51 +0000547 /* Current scheduling status.
548
549 Complications: whenever this is set to VgTs_WaitMX, you
550 should also set .m_edx to whatever the required return value
551 is for pthread_mutex_lock / pthread_cond_timedwait for when
552 the mutex finally gets unblocked. */
sewardj2e93c502002-04-12 11:12:52 +0000553 ThreadStatus status;
554
sewardj3b5d8862002-04-20 13:53:23 +0000555 /* When .status == WaitMX, points to the mutex I am waiting for.
556 When .status == WaitCV, points to the mutex associated with
557 the condition variable indicated by the .associated_cv field.
558 In all other cases, should be NULL. */
559 void* /* pthread_mutex_t* */ associated_mx;
560
561 /* When .status == WaitCV, points to the condition variable I am
562 waiting for. In all other cases, should be NULL. */
563 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000564
sewardj5f07b662002-04-23 16:52:51 +0000565 /* If VgTs_Sleeping, this is when we should wake up, measured in
566 milliseconds as supplied by VG_(read_millisecond_counter).
567
568 If VgTs_WaitCV, this indicates the time at which
569 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
570 this means infinitely far in the future, viz,
571 pthread_cond_wait. */
572 UInt awaken_at;
sewardj2e93c502002-04-12 11:12:52 +0000573
sewardj20917d82002-05-28 01:36:45 +0000574 /* If VgTs_WaitJoiner, return value, as generated by joinees. */
575 void* joinee_retval;
576
577 /* If VgTs_WaitJoinee, place to copy the return value to, and
578 the identity of the thread we're waiting for. */
579 void** joiner_thread_return;
580 ThreadId joiner_jee_tid;
581
sewardj8ad94e12002-05-29 00:10:20 +0000582 /* Whether or not detached. */
583 Bool detached;
584
sewardj20917d82002-05-28 01:36:45 +0000585 /* Cancelability state and type. */
586 Bool cancel_st; /* False==PTH_CANCEL_DISABLE; True==.._ENABLE */
587 Bool cancel_ty; /* False==PTH_CANC_ASYNCH; True==..._DEFERRED */
588
589 /* Pointer to fn to call to do cancellation. Indicates whether
590 or not cancellation is pending. If NULL, not pending. Else
591 should be &thread_exit_wrapper(), indicating that
592 cancallation is pending. */
593 void (*cancel_pend)(void*);
594
sewardj8ad94e12002-05-29 00:10:20 +0000595 /* The cleanup stack. */
596 Int custack_used;
597 CleanupEntry custack[VG_N_CLEANUPSTACK];
sewardj2e93c502002-04-12 11:12:52 +0000598
sewardj5f07b662002-04-23 16:52:51 +0000599 /* thread-specific data */
600 void* specifics[VG_N_THREAD_KEYS];
601
sewardjb48e5002002-05-13 00:16:03 +0000602 /* This thread's blocked-signals mask. Semantics is that for a
603 signal to be delivered to this thread, the signal must not be
604 blocked by either the process-wide signal mask nor by this
605 one. So, if this thread is prepared to handle any signal that
606 the process as a whole is prepared to handle, this mask should
607 be made empty -- and that it is its default, starting
608 state. */
609 vki_ksigset_t sig_mask;
610
611 /* When not VgTs_WaitSIG, has no meaning. When VgTs_WaitSIG,
612 is the set of signals for which we are sigwait()ing. */
613 vki_ksigset_t sigs_waited_for;
614
sewardj2e93c502002-04-12 11:12:52 +0000615 /* Stacks. When a thread slot is freed, we don't deallocate its
616 stack; we just leave it lying around for the next use of the
617 slot. If the next use of the slot requires a larger stack,
618 only then is the old one deallocated and a new one
619 allocated.
620
621 For the main thread (threadid == 0), this mechanism doesn't
622 apply. We don't know the size of the stack since we didn't
623 allocate it, and furthermore we never reallocate it. */
624
625 /* The allocated size of this thread's stack (permanently zero
626 if this is ThreadId == 0, since we didn't allocate its stack) */
627 UInt stack_size;
628
629 /* Address of the lowest word in this thread's stack. NULL means
630 not allocated yet.
631 */
632 Addr stack_base;
633
sewardj1e8cdc92002-04-18 11:37:52 +0000634 /* Address of the highest legitimate word in this stack. This is
635 used for error messages only -- not critical for execution
636 correctness. Is is set for all stacks, specifically including
637 ThreadId == 0 (the main thread). */
638 Addr stack_highest_word;
639
sewardj2e93c502002-04-12 11:12:52 +0000640 /* Saved machine context. */
641 UInt m_eax;
642 UInt m_ebx;
643 UInt m_ecx;
644 UInt m_edx;
645 UInt m_esi;
646 UInt m_edi;
647 UInt m_ebp;
648 UInt m_esp;
649 UInt m_eflags;
650 UInt m_eip;
651 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
652
653 UInt sh_eax;
654 UInt sh_ebx;
655 UInt sh_ecx;
656 UInt sh_edx;
657 UInt sh_esi;
658 UInt sh_edi;
659 UInt sh_ebp;
660 UInt sh_esp;
661 UInt sh_eflags;
662 }
663 ThreadState;
664
665
sewardj018f7622002-05-15 21:13:39 +0000666/* The thread table. */
667extern ThreadState VG_(threads)[VG_N_THREADS];
668
669/* Check that tid is in range and denotes a non-Empty thread. */
sewardjb48e5002002-05-13 00:16:03 +0000670extern Bool VG_(is_valid_tid) ( ThreadId tid );
671
sewardj018f7622002-05-15 21:13:39 +0000672/* Check that tid is in range. */
673extern Bool VG_(is_valid_or_empty_tid) ( ThreadId tid );
674
sewardj2e93c502002-04-12 11:12:52 +0000675/* Copy the specified thread's state into VG_(baseBlock) in
676 preparation for running it. */
677extern void VG_(load_thread_state)( ThreadId );
678
679/* Save the specified thread's state back in VG_(baseBlock), and fill
680 VG_(baseBlock) with junk, for sanity-check reasons. */
681extern void VG_(save_thread_state)( ThreadId );
682
sewardj1e8cdc92002-04-18 11:37:52 +0000683/* And for the currently running one, if valid. */
684extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000685
sewardj1e8cdc92002-04-18 11:37:52 +0000686/* Similarly ... */
687extern ThreadId VG_(get_current_tid) ( void );
688
689/* Which thread is this address in the stack of, if any? Used for
690 error message generation. */
691extern ThreadId VG_(identify_stack_addr)( Addr a );
692
sewardj2e93c502002-04-12 11:12:52 +0000693
694/* Return codes from the scheduler. */
695typedef
sewardj7e87e382002-05-03 19:09:05 +0000696 enum {
697 VgSrc_Deadlock, /* no runnable threads and no prospect of any
698 even if we wait for a long time */
699 VgSrc_ExitSyscall, /* client called exit(). This is the normal
700 route out. */
701 VgSrc_BbsDone /* In a debugging run, the specified number of
702 bbs has been completed. */
703 }
sewardj2e93c502002-04-12 11:12:52 +0000704 VgSchedReturnCode;
705
sewardj7e87e382002-05-03 19:09:05 +0000706
sewardj2e93c502002-04-12 11:12:52 +0000707/* The scheduler. */
708extern VgSchedReturnCode VG_(scheduler) ( void );
709
710extern void VG_(scheduler_init) ( void );
711
sewardj15a43e12002-04-17 19:35:12 +0000712extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000713
714/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
715extern jmp_buf VG_(scheduler_jmpbuf);
716/* ... and if so, here's the signal which caused it to do so. */
717extern Int VG_(longjmpd_on_signal);
718
719
sewardja1679dd2002-05-10 22:31:40 +0000720/* Possible places where the main stack might be based. We check that
721 the initial stack, which we can't move, is allocated here.
722 VG_(scheduler_init) checks this. Andrea Archelangi's 2.4 kernels
723 have been rumoured to start stacks at 0x80000000, so that too is
724 considered.
sewardj2e93c502002-04-12 11:12:52 +0000725*/
sewardja1679dd2002-05-10 22:31:40 +0000726#define VG_STARTUP_STACK_BASE_1 (Addr)0xC0000000
727#define VG_STARTUP_STACK_BASE_2 (Addr)0x80000000
728#define VG_STARTUP_STACK_SMALLERTHAN 0x100000 /* 1024k */
729
730#define VG_STACK_MATCHES_BASE(zzstack, zzbase) \
731 ( \
732 ((zzstack) & ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN)) \
733 == \
734 ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN) \
735 )
sewardj2e93c502002-04-12 11:12:52 +0000736
737
738/* The red-zone size which we put at the bottom (highest address) of
739 thread stacks, for paranoia reasons. This can be arbitrary, and
740 doesn't really need to be set at compile time. */
741#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
742
743#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
744 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
745
746
sewardj018f7622002-05-15 21:13:39 +0000747/* Write a value to the client's %EDX (request return value register)
748 and set the shadow to indicate it is defined. */
749#define SET_EDX(zztid, zzval) \
750 do { VG_(threads)[zztid].m_edx = (zzval); \
751 VG_(threads)[zztid].sh_edx = VGM_WORD_VALID; \
752 } while (0)
753
754#define SET_EAX(zztid, zzval) \
755 do { VG_(threads)[zztid].m_eax = (zzval); \
756 VG_(threads)[zztid].sh_eax = VGM_WORD_VALID; \
757 } while (0)
758
sewardj2e93c502002-04-12 11:12:52 +0000759
760/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000761 Exports of vg_signals.c
762 ------------------------------------------------------------------ */
763
sewardjde4a1d02002-03-22 01:27:54 +0000764extern void VG_(sigstartup_actions) ( void );
765
sewardjb48e5002002-05-13 00:16:03 +0000766extern Bool VG_(deliver_signals) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000767extern void VG_(unblock_host_signal) ( Int sigNo );
sewardj018f7622002-05-15 21:13:39 +0000768extern void VG_(handle_SCSS_change) ( Bool force_update );
769
sewardjde4a1d02002-03-22 01:27:54 +0000770
771/* Fake system calls for signal handling. */
sewardj2342c972002-05-22 23:34:20 +0000772extern void VG_(do__NR_sigaltstack) ( ThreadId tid );
sewardj2e93c502002-04-12 11:12:52 +0000773extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardj018f7622002-05-15 21:13:39 +0000774extern void VG_(do__NR_sigprocmask) ( ThreadId tid,
775 Int how,
776 vki_ksigset_t* set,
777 vki_ksigset_t* oldset );
778extern void VG_(do_pthread_sigmask_SCSS_upd) ( ThreadId tid,
779 Int how,
780 vki_ksigset_t* set,
781 vki_ksigset_t* oldset );
782extern void VG_(send_signal_to_thread) ( ThreadId thread,
783 Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000784
sewardj2e93c502002-04-12 11:12:52 +0000785/* Modify the current thread's state once we have detected it is
786 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000787extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000788
sewardj2e93c502002-04-12 11:12:52 +0000789/* Handy utilities to block/restore all host signals. */
790extern void VG_(block_all_host_signals)
791 ( /* OUT */ vki_ksigset_t* saved_mask );
sewardj018f7622002-05-15 21:13:39 +0000792extern void VG_(restore_all_host_signals)
sewardj2e93c502002-04-12 11:12:52 +0000793 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000794
795/* ---------------------------------------------------------------------
796 Exports of vg_mylibc.c
797 ------------------------------------------------------------------ */
798
799
sewardjfbe18b92002-05-10 00:46:59 +0000800#if !defined(NULL)
801# define NULL ((void*)0)
802#endif
sewardjde4a1d02002-03-22 01:27:54 +0000803
804extern void VG_(exit)( Int status )
805 __attribute__ ((__noreturn__));
806
807extern void VG_(printf) ( const char *format, ... );
808/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
809
810extern void VG_(sprintf) ( Char* buf, Char *format, ... );
811
812extern void VG_(vprintf) ( void(*send)(Char),
813 const Char *format, va_list vargs );
814
815extern Bool VG_(isspace) ( Char c );
816
817extern Int VG_(strlen) ( const Char* str );
818
819extern Long VG_(atoll) ( Char* str );
820
821extern Char* VG_(strcat) ( Char* dest, const Char* src );
822extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
823extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
824
825extern Char* VG_(strcpy) ( Char* dest, const Char* src );
826
827extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
828extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
829
830extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
831extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
832
833extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
834extern Char* VG_(strchr) ( const Char* s, Char c );
835extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
836
837extern Char* VG_(getenv) ( Char* name );
838extern Int VG_(getpid) ( void );
sewardj5f07b662002-04-23 16:52:51 +0000839
840extern void VG_(start_rdtsc_calibration) ( void );
841extern void VG_(end_rdtsc_calibration) ( void );
842extern UInt VG_(read_millisecond_timer) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000843
844
845extern Char VG_(toupper) ( Char c );
846
847extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
848
849extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
850
851extern Bool VG_(stringMatch) ( Char* pat, Char* str );
852
853
sewardj3e1eb1f2002-05-18 13:14:17 +0000854#define VG__STRING(__str) #__str
sewardjde4a1d02002-03-22 01:27:54 +0000855
856/* Asserts are permanently enabled. Hurrah! */
857#define vg_assert(expr) \
858 ((void) ((expr) ? 0 : \
sewardj3e1eb1f2002-05-18 13:14:17 +0000859 (VG_(assert_fail) (VG__STRING(expr), \
sewardjde4a1d02002-03-22 01:27:54 +0000860 __FILE__, __LINE__, \
861 __PRETTY_FUNCTION__), 0)))
862
863extern void VG_(assert_fail) ( Char* expr, Char* file,
864 Int line, Char* fn )
865 __attribute__ ((__noreturn__));
866
njn4f9c9342002-04-29 16:03:24 +0000867/* Reading and writing files. */
sewardjde4a1d02002-03-22 01:27:54 +0000868extern Int VG_(open_read) ( Char* pathname );
njn4f9c9342002-04-29 16:03:24 +0000869extern Int VG_(open_write) ( Char* pathname );
870extern Int VG_(create_and_write) ( Char* pathname );
sewardjde4a1d02002-03-22 01:27:54 +0000871extern void VG_(close) ( Int fd );
872extern Int VG_(read) ( Int fd, void* buf, Int count);
873extern Int VG_(write) ( Int fd, void* buf, Int count);
sewardjb3586202002-05-09 17:38:13 +0000874extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
sewardjde4a1d02002-03-22 01:27:54 +0000875
sewardj2e93c502002-04-12 11:12:52 +0000876extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
877
878extern Int VG_(select)( Int n,
879 vki_fd_set* readfds,
880 vki_fd_set* writefds,
881 vki_fd_set* exceptfds,
882 struct vki_timeval * timeout );
883extern Int VG_(nanosleep)( const struct vki_timespec *req,
884 struct vki_timespec *rem );
885
886
sewardjde4a1d02002-03-22 01:27:54 +0000887/* mmap-ery ... */
888extern void* VG_(mmap)( void* start, UInt length,
889 UInt prot, UInt flags, UInt fd, UInt offset );
890
sewardj2e93c502002-04-12 11:12:52 +0000891extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000892
sewardjb3586202002-05-09 17:38:13 +0000893extern void* VG_(brk) ( void* end_data_segment );
894
sewardjde4a1d02002-03-22 01:27:54 +0000895
896/* Print a (panic) message, and abort. */
897extern void VG_(panic) ( Char* str )
898 __attribute__ ((__noreturn__));
899
900/* Get memory by anonymous mmap. */
sewardje6a25242002-04-21 22:03:07 +0000901extern void* VG_(get_memory_from_mmap) ( Int nBytes );
902
903/* Crude stand-in for the glibc system() call. */
904extern Int VG_(system) ( Char* cmd );
905
sewardjde4a1d02002-03-22 01:27:54 +0000906
907/* Signal stuff. Note that these use the vk_ (kernel) structure
908 definitions, which are different in places from those that glibc
909 defines. Since we're operating right at the kernel interface,
910 glibc's view of the world is entirely irrelevant. */
sewardj018f7622002-05-15 21:13:39 +0000911
912/* --- Signal set ops --- */
sewardjb48e5002002-05-13 00:16:03 +0000913extern Int VG_(ksigfillset)( vki_ksigset_t* set );
914extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
sewardjde4a1d02002-03-22 01:27:54 +0000915
sewardj018f7622002-05-15 21:13:39 +0000916extern Bool VG_(kisfullsigset)( vki_ksigset_t* set );
917extern Bool VG_(kisemptysigset)( vki_ksigset_t* set );
918
919extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
920extern Int VG_(ksigdelset)( vki_ksigset_t* set, Int signum );
921extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
922
sewardjb48e5002002-05-13 00:16:03 +0000923extern void VG_(ksigaddset_from_set)( vki_ksigset_t* dst,
924 vki_ksigset_t* src );
925extern void VG_(ksigdelset_from_set)( vki_ksigset_t* dst,
926 vki_ksigset_t* src );
927
sewardj018f7622002-05-15 21:13:39 +0000928/* --- Mess with the kernel's sig state --- */
929extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
930 vki_ksigset_t* oldset );
931extern Int VG_(ksigaction) ( Int signum,
932 const vki_ksigaction* act,
933 vki_ksigaction* oldact );
sewardjde4a1d02002-03-22 01:27:54 +0000934
935extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
936
937extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
938
sewardj018f7622002-05-15 21:13:39 +0000939extern Int VG_(kill)( Int pid, Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000940
941
942/* ---------------------------------------------------------------------
943 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
944 vg_from_ucode.c).
945 ------------------------------------------------------------------ */
946
947/* Tags which describe what operands are. */
948typedef
949 enum { TempReg=0, ArchReg=1, RealReg=2,
950 SpillNo=3, Literal=4, Lit16=5,
951 NoValue=6 }
952 Tag;
953
954
955/* Microinstruction opcodes. */
956typedef
957 enum {
958 NOP,
959 GET,
960 PUT,
961 LOAD,
962 STORE,
963 MOV,
964 CMOV, /* Used for cmpxchg and cmov */
965 WIDEN,
966 JMP,
967
968 /* Read/write the %EFLAGS register into a TempReg. */
969 GETF, PUTF,
970
971 ADD, ADC, AND, OR, XOR, SUB, SBB,
972 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
973 NOT, NEG, INC, DEC, BSWAP,
974 CC2VAL,
975
976 /* Not strictly needed, but useful for making better
977 translations of address calculations. */
978 LEA1, /* reg2 := const + reg1 */
979 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
980
981 /* not for translating x86 calls -- only to call helpers */
982 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
983 for CALLM. */
984 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
985 CALLM, /* call to a machine-code helper */
986
987 /* Hack for translating string (REP-) insns. Jump to literal if
988 TempReg/RealReg is zero. */
989 JIFZ,
990
991 /* FPU ops which read/write mem or don't touch mem at all. */
992 FPU_R,
993 FPU_W,
994 FPU,
995
996 /* Advance the simulated %eip by some small (< 128) number. */
997 INCEIP,
998
999 /* uinstrs which are not needed for mere translation of x86 code,
1000 only for instrumentation of it. */
1001 LOADV,
1002 STOREV,
1003 GETV,
1004 PUTV,
1005 TESTV,
1006 SETV,
1007 /* Get/set the v-bit (and it is only one bit) for the simulated
1008 %eflags register. */
1009 GETVF,
1010 PUTVF,
1011
1012 /* Do a unary or binary tag op. Only for post-instrumented
1013 code. For TAG1, first and only arg is a TempReg, and is both
1014 arg and result reg. For TAG2, first arg is src, second is
1015 dst, in the normal way; both are TempRegs. In both cases,
1016 3rd arg is a RiCHelper with a Lit16 tag. This indicates
1017 which tag op to do. */
1018 TAG1,
1019 TAG2
1020 }
1021 Opcode;
1022
1023
1024/* Condition codes, observing the Intel encoding. CondAlways is an
1025 extra. */
1026typedef
1027 enum {
1028 CondO = 0, /* overflow */
1029 CondNO = 1, /* no overflow */
1030 CondB = 2, /* below */
1031 CondNB = 3, /* not below */
1032 CondZ = 4, /* zero */
1033 CondNZ = 5, /* not zero */
1034 CondBE = 6, /* below or equal */
1035 CondNBE = 7, /* not below or equal */
1036 CondS = 8, /* negative */
1037 ConsNS = 9, /* not negative */
1038 CondP = 10, /* parity even */
1039 CondNP = 11, /* not parity even */
1040 CondL = 12, /* jump less */
1041 CondNL = 13, /* not less */
1042 CondLE = 14, /* less or equal */
1043 CondNLE = 15, /* not less or equal */
1044 CondAlways = 16 /* Jump always */
1045 }
1046 Condcode;
1047
1048
sewardj2e93c502002-04-12 11:12:52 +00001049/* Descriptions of additional properties of *unconditional* jumps. */
1050typedef
1051 enum {
1052 JmpBoring=0, /* boring unconditional jump */
1053 JmpCall=1, /* jump due to an x86 call insn */
1054 JmpRet=2, /* jump due to an x86 ret insn */
1055 JmpSyscall=3, /* do a system call, then jump */
1056 JmpClientReq=4 /* do a client request, then jump */
1057 }
1058 JmpKind;
1059
1060
sewardjde4a1d02002-03-22 01:27:54 +00001061/* Flags. User-level code can only read/write O(verflow), S(ign),
1062 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
1063 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
1064 thusly:
1065 76543210
1066 DOSZACP
1067 and bit 7 must always be zero since it is unused.
1068*/
1069typedef UChar FlagSet;
1070
1071#define FlagD (1<<6)
1072#define FlagO (1<<5)
1073#define FlagS (1<<4)
1074#define FlagZ (1<<3)
1075#define FlagA (1<<2)
1076#define FlagC (1<<1)
1077#define FlagP (1<<0)
1078
1079#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
1080#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
1081#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
1082#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
1083#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
1084#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +00001085#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +00001086#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +00001087#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +00001088
1089#define FlagsALL (FlagsOSZACP | FlagD)
1090#define FlagsEmpty (FlagSet)0
1091
1092#define VG_IS_FLAG_SUBSET(set1,set2) \
1093 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
1094
1095#define VG_UNION_FLAG_SETS(set1,set2) \
1096 ( ((FlagSet)set1) | ((FlagSet)set2) )
1097
1098
1099
1100/* A Micro (u)-instruction. */
1101typedef
1102 struct {
1103 /* word 1 */
1104 UInt lit32; /* 32-bit literal */
1105
1106 /* word 2 */
1107 UShort val1; /* first operand */
1108 UShort val2; /* second operand */
1109
1110 /* word 3 */
1111 UShort val3; /* third operand */
1112 UChar opcode; /* opcode */
1113 UChar size; /* data transfer size */
1114
1115 /* word 4 */
1116 FlagSet flags_r; /* :: FlagSet */
1117 FlagSet flags_w; /* :: FlagSet */
1118 UChar tag1:4; /* first operand tag */
1119 UChar tag2:4; /* second operand tag */
1120 UChar tag3:4; /* third operand tag */
1121 UChar extra4b:4; /* Spare field, used by WIDEN for src
1122 -size, and by LEA2 for scale
njn4f9c9342002-04-29 16:03:24 +00001123 (1,2,4 or 8), and by unconditional JMPs for
1124 orig x86 instr size if --cachesim=yes */
1125
sewardjde4a1d02002-03-22 01:27:54 +00001126
1127 /* word 5 */
1128 UChar cond; /* condition, for jumps */
1129 Bool smc_check:1; /* do a smc test, if writes memory. */
1130 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +00001131 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +00001132 }
1133 UInstr;
1134
1135
1136/* Expandable arrays of uinstrs. */
1137typedef
1138 struct {
1139 Int used;
1140 Int size;
1141 UInstr* instrs;
1142 Int nextTemp;
1143 }
1144 UCodeBlock;
1145
1146/* Refer to `the last instruction stuffed in', including as an
1147 lvalue. */
1148#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1149
1150/* An invalid temporary number :-) */
1151#define INVALID_TEMPREG 999999999
1152
1153
1154/* ---------------------------------------------------------------------
1155 Exports of vg_demangle.c
1156 ------------------------------------------------------------------ */
1157
1158extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
1159
1160
1161/* ---------------------------------------------------------------------
1162 Exports of vg_from_ucode.c
1163 ------------------------------------------------------------------ */
1164
1165extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
1166
1167
1168/* ---------------------------------------------------------------------
1169 Exports of vg_to_ucode.c
1170 ------------------------------------------------------------------ */
1171
1172extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
1173extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
1174extern Char VG_(nameOfIntSize) ( Int size );
1175extern UInt VG_(extend_s_8to32) ( UInt x );
1176extern Int VG_(getNewTemp) ( UCodeBlock* cb );
1177extern Int VG_(getNewShadow) ( UCodeBlock* cb );
1178
1179#define SHADOW(tempreg) ((tempreg)+1)
1180
1181
1182/* ---------------------------------------------------------------------
1183 Exports of vg_translate.c
1184 ------------------------------------------------------------------ */
1185
sewardj1e8cdc92002-04-18 11:37:52 +00001186extern void VG_(translate) ( ThreadState* tst,
1187 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001188 UInt* orig_size,
1189 Addr* trans_addr,
1190 UInt* trans_size );
1191
1192extern void VG_(emptyUInstr) ( UInstr* u );
1193extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1194extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
1195 Tag tag1, UInt val1 );
1196extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
1197 Tag tag1, UInt val1,
1198 Tag tag2, UInt val2 );
1199extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
1200 Tag tag1, UInt val1,
1201 Tag tag2, UInt val2,
1202 Tag tag3, UInt val3 );
1203extern void VG_(setFlagRW) ( UInstr* u,
1204 FlagSet fr, FlagSet fw );
1205
1206extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1207extern Bool VG_(anyFlagUse) ( UInstr* u );
1208
1209
1210
1211extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1212extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1213
njn4f9c9342002-04-29 16:03:24 +00001214extern UCodeBlock* VG_(allocCodeBlock) ( void );
1215extern void VG_(freeCodeBlock) ( UCodeBlock* cb );
1216extern void VG_(copyUInstr) ( UCodeBlock* cb, UInstr* instr );
1217
sewardjde4a1d02002-03-22 01:27:54 +00001218extern Char* VG_(nameCondcode) ( Condcode cond );
1219extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1220extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1221extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1222extern Int VG_(rankToRealRegNo) ( Int rank );
1223
1224extern void* VG_(jitmalloc) ( Int nbytes );
1225extern void VG_(jitfree) ( void* ptr );
1226
1227
1228/* ---------------------------------------------------------------------
1229 Exports of vg_execontext.c.
1230 ------------------------------------------------------------------ */
1231
1232/* Records the PC and a bit of the call chain. The first 4 %eip
1233 values are used in comparisons do remove duplicate errors, and for
1234 comparing against suppression specifications. The rest are purely
1235 informational (but often important). */
1236
1237typedef
1238 struct _ExeContextRec {
1239 struct _ExeContextRec * next;
1240 /* The size of this array is VG_(clo_backtrace_size); at least
1241 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1242 [1] is its caller, [2] is the caller of [1], etc. */
1243 Addr eips[0];
1244 }
1245 ExeContext;
1246
1247
1248/* Initialise the ExeContext storage mechanism. */
1249extern void VG_(init_ExeContext_storage) ( void );
1250
1251/* Print stats (informational only). */
1252extern void VG_(show_ExeContext_stats) ( void );
1253
1254
1255/* Take a snapshot of the client's stack. Search our collection of
1256 ExeContexts to see if we already have it, and if not, allocate a
1257 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001258extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1259 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001260
1261/* Print an ExeContext. */
1262extern void VG_(pp_ExeContext) ( ExeContext* );
1263
1264/* Compare two ExeContexts, just comparing the top two callers. */
1265extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1266
1267/* Compare two ExeContexts, just comparing the top four callers. */
1268extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1269
1270/* Compare two ExeContexts, comparing all callers. */
1271extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1272
1273
1274
1275/* ---------------------------------------------------------------------
1276 Exports of vg_errcontext.c.
1277 ------------------------------------------------------------------ */
1278
1279extern void VG_(load_suppressions) ( void );
1280extern void VG_(show_all_errors) ( void );
1281extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001282extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1283extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001284extern void VG_(record_address_error) ( Addr a, Int size,
1285 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001286
1287extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001288
1289extern void VG_(record_param_err) ( ThreadState* tst,
1290 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001291 Bool isWriteLack,
1292 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001293extern void VG_(record_user_err) ( ThreadState* tst,
1294 Addr a, Bool isWriteLack );
sewardjde4a1d02002-03-22 01:27:54 +00001295
1296
1297/* The classification of a faulting address. */
1298typedef
sewardjb581a132002-05-08 00:32:50 +00001299 enum { Undescribed, /* as-yet unclassified */
1300 Stack,
1301 Unknown, /* classification yielded nothing useful */
1302 Freed, Mallocd,
1303 UserG, UserS }
sewardjde4a1d02002-03-22 01:27:54 +00001304 AddrKind;
1305
1306/* Records info about a faulting address. */
1307typedef
1308 struct {
1309 /* ALL */
1310 AddrKind akind;
1311 /* Freed, Mallocd */
1312 Int blksize;
1313 /* Freed, Mallocd */
1314 Int rwoffset;
1315 /* Freed, Mallocd */
1316 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001317 /* Stack */
1318 ThreadId stack_tid;
sewardjb581a132002-05-08 00:32:50 +00001319 /* True if is just-below %esp -- could be a gcc bug. */
1320 Bool maybe_gcc;
sewardjde4a1d02002-03-22 01:27:54 +00001321 }
1322 AddrInfo;
1323
1324
1325/* ---------------------------------------------------------------------
1326 Exports of vg_clientperms.c
1327 ------------------------------------------------------------------ */
1328
1329extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1330
sewardj8c824512002-04-14 04:16:48 +00001331extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001332
1333extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1334
1335extern void VG_(show_client_block_stats) ( void );
1336
1337
1338/* ---------------------------------------------------------------------
1339 Exports of vg_procselfmaps.c
1340 ------------------------------------------------------------------ */
1341
1342extern
1343void VG_(read_procselfmaps) (
1344 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1345);
1346
1347
1348/* ---------------------------------------------------------------------
1349 Exports of vg_symtab2.c
1350 ------------------------------------------------------------------ */
1351
1352/* We assume the executable is loaded here ... can't really find
1353 out. There is a hacky sanity check in vg_init_memory_audit()
1354 which should trip up most stupidities.
1355*/
1356#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1357
1358extern void VG_(read_symbols) ( void );
1359extern void VG_(mini_stack_dump) ( ExeContext* ec );
1360extern void VG_(what_obj_and_fun_is_this)
1361 ( Addr a,
1362 Char* obj_buf, Int n_obj_buf,
1363 Char* fun_buf, Int n_fun_buf );
njn4f9c9342002-04-29 16:03:24 +00001364extern Bool VG_(what_line_is_this) ( Addr a,
1365 UChar* filename, Int n_filename,
1366 UInt* lineno );
1367extern Bool VG_(what_fn_is_this) ( Bool no_demangle, Addr a,
1368 Char* fn_name, Int n_fn_name);
sewardjde4a1d02002-03-22 01:27:54 +00001369
sewardj18d75132002-05-16 11:06:21 +00001370extern Bool VG_(symtab_notify_munmap) ( Addr start, UInt length );
sewardjde4a1d02002-03-22 01:27:54 +00001371
1372
1373/* ---------------------------------------------------------------------
1374 Exports of vg_clientmalloc.c
1375 ------------------------------------------------------------------ */
1376
sewardjde4a1d02002-03-22 01:27:54 +00001377typedef
1378 enum {
1379 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001380 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001381 Vg_AllocNewVec = 2
1382 }
1383 VgAllocKind;
1384
1385/* Description of a malloc'd chunk. */
1386typedef
1387 struct _ShadowChunk {
1388 struct _ShadowChunk* next;
1389 ExeContext* where; /* where malloc'd/free'd */
1390 UInt size : 30; /* size requested. */
1391 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1392 Addr data; /* ptr to actual block. */
1393 }
1394 ShadowChunk;
1395
1396extern void VG_(clientmalloc_done) ( void );
1397extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1398extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1399
sewardj2e93c502002-04-12 11:12:52 +00001400/* These are called from the scheduler, when it intercepts a user
1401 request. */
sewardj8c824512002-04-14 04:16:48 +00001402extern void* VG_(client_malloc) ( ThreadState* tst,
1403 UInt size, VgAllocKind kind );
1404extern void* VG_(client_memalign) ( ThreadState* tst,
1405 UInt align, UInt size );
1406extern void VG_(client_free) ( ThreadState* tst,
1407 void* ptrV, VgAllocKind kind );
1408extern void* VG_(client_calloc) ( ThreadState* tst,
1409 UInt nmemb, UInt size1 );
1410extern void* VG_(client_realloc) ( ThreadState* tst,
1411 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001412
1413
1414/* ---------------------------------------------------------------------
1415 Exports of vg_main.c
1416 ------------------------------------------------------------------ */
1417
sewardjde4a1d02002-03-22 01:27:54 +00001418/* A structure used as an intermediary when passing the simulated
1419 CPU's state to some assembly fragments, particularly system calls.
1420 Stuff is copied from baseBlock to here, the assembly magic runs,
1421 and then the inverse copy is done. */
1422
1423extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1424 + 1 /* %eflags */
1425 + 1 /* %eip */
1426 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1427 ];
1428
1429/* Handy fns for doing the copy back and forth. */
1430extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1431extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1432
sewardjde4a1d02002-03-22 01:27:54 +00001433/* Called when some unhandleable client behaviour is detected.
1434 Prints a msg and aborts. */
1435extern void VG_(unimplemented) ( Char* msg );
sewardjcfc39b22002-05-08 01:58:18 +00001436extern void VG_(nvidia_moan) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001437
1438/* The stack on which Valgrind runs. We can't use the same stack as the
1439 simulatee -- that's an important design decision. */
1440extern UInt VG_(stack)[10000];
1441
1442/* Similarly, we have to ask for signals to be delivered on an
1443 alternative stack, since it is possible, although unlikely, that
1444 we'll have to run client code from inside the Valgrind-installed
1445 signal handler. If this happens it will be done by
1446 vg_deliver_signal_immediately(). */
1447extern UInt VG_(sigstack)[10000];
1448
sewardjde4a1d02002-03-22 01:27:54 +00001449/* Holds client's %esp at the point we gained control. From this the
1450 client's argc, argv and envp are deduced. */
1451extern Addr VG_(esp_at_startup);
1452extern Int VG_(client_argc);
1453extern Char** VG_(client_argv);
1454extern Char** VG_(client_envp);
1455
1456/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
sewardj3e1eb1f2002-05-18 13:14:17 +00001457 don't get traced into. Also mess up $libdir/valgrind so that our
1458 libpthread.so disappears from view. */
1459void VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) ( Char* ld_preload_str,
1460 Char* ld_library_path_str );
sewardjde4a1d02002-03-22 01:27:54 +00001461
1462/* Something of a function looking for a home ... start up GDB. This
1463 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1464 *client's* stack. This is necessary to give GDB the illusion that
1465 the client program really was running on the real cpu. */
1466extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1467
1468/* Spew out vast amounts of junk during JITting? */
1469extern Bool VG_(disassemble);
1470
1471/* 64-bit counter for the number of basic blocks done. */
1472extern ULong VG_(bbs_done);
1473/* 64-bit counter for the number of bbs to go before a debug exit. */
1474extern ULong VG_(bbs_to_go);
1475
1476/* Counts downwards in vg_run_innerloop. */
1477extern UInt VG_(dispatch_ctr);
1478
sewardjde4a1d02002-03-22 01:27:54 +00001479/* Is the client running on the simulated CPU or the real one? */
1480extern Bool VG_(running_on_simd_CPU); /* Initially False */
1481
1482/* The current LRU epoch. */
1483extern UInt VG_(current_epoch);
1484
sewardj7e87e382002-05-03 19:09:05 +00001485/* This is the ThreadId of the last thread the scheduler ran. */
1486extern ThreadId VG_(last_run_tid);
1487
sewardjde4a1d02002-03-22 01:27:54 +00001488
1489/* --- Counters, for informational purposes only. --- */
1490
1491/* Number of lookups which miss the fast tt helper. */
1492extern UInt VG_(tt_fast_misses);
1493
1494/* Counts for LRU informational messages. */
1495
1496/* Number and total o/t size of new translations this epoch. */
1497extern UInt VG_(this_epoch_in_count);
1498extern UInt VG_(this_epoch_in_osize);
1499extern UInt VG_(this_epoch_in_tsize);
1500/* Number and total o/t size of discarded translations this epoch. */
1501extern UInt VG_(this_epoch_out_count);
1502extern UInt VG_(this_epoch_out_osize);
1503extern UInt VG_(this_epoch_out_tsize);
1504/* Number and total o/t size of translations overall. */
1505extern UInt VG_(overall_in_count);
1506extern UInt VG_(overall_in_osize);
1507extern UInt VG_(overall_in_tsize);
1508/* Number and total o/t size of discards overall. */
1509extern UInt VG_(overall_out_count);
1510extern UInt VG_(overall_out_osize);
1511extern UInt VG_(overall_out_tsize);
1512
1513/* The number of LRU-clearings of TT/TC. */
1514extern UInt VG_(number_of_lrus);
1515
1516/* Counts pertaining to the register allocator. */
1517
1518/* total number of uinstrs input to reg-alloc */
1519extern UInt VG_(uinstrs_prealloc);
1520
1521/* total number of uinstrs added due to spill code */
1522extern UInt VG_(uinstrs_spill);
1523
1524/* number of bbs requiring spill code */
1525extern UInt VG_(translations_needing_spill);
1526
1527/* total of register ranks over all translations */
1528extern UInt VG_(total_reg_rank);
1529
sewardjde4a1d02002-03-22 01:27:54 +00001530/* Counts pertaining to internal sanity checking. */
1531extern UInt VG_(sanity_fast_count);
1532extern UInt VG_(sanity_slow_count);
1533
sewardj2e93c502002-04-12 11:12:52 +00001534/* Counts pertaining to the scheduler. */
1535extern UInt VG_(num_scheduling_events_MINOR);
1536extern UInt VG_(num_scheduling_events_MAJOR);
1537
sewardjde4a1d02002-03-22 01:27:54 +00001538
1539/* ---------------------------------------------------------------------
1540 Exports of vg_memory.c
1541 ------------------------------------------------------------------ */
1542
1543extern void VGM_(init_memory_audit) ( void );
1544extern Addr VGM_(curr_dataseg_end);
1545extern void VG_(show_reg_tags) ( void );
1546extern void VG_(detect_memory_leaks) ( void );
1547extern void VG_(done_prof_mem) ( void );
1548
1549/* Set permissions for an address range. Not speed-critical. */
1550extern void VGM_(make_noaccess) ( Addr a, UInt len );
1551extern void VGM_(make_writable) ( Addr a, UInt len );
1552extern void VGM_(make_readable) ( Addr a, UInt len );
1553/* Use with care! (read: use for shmat only) */
1554extern void VGM_(make_readwritable) ( Addr a, UInt len );
1555extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1556 UInt len );
1557
1558/* Check permissions for an address range. Not speed-critical. */
1559extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1560extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1561extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1562
sewardj0c3b53f2002-05-01 01:58:35 +00001563/* Sanity checks which may be done at any time. The scheduler decides
1564 when. */
1565extern void VG_(do_sanity_checks) ( Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001566/* Very cheap ... */
1567extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1568
1569/* These functions are called from generated code. */
1570extern void VG_(helperc_STOREV4) ( UInt, Addr );
1571extern void VG_(helperc_STOREV2) ( UInt, Addr );
1572extern void VG_(helperc_STOREV1) ( UInt, Addr );
1573
1574extern UInt VG_(helperc_LOADV1) ( Addr );
1575extern UInt VG_(helperc_LOADV2) ( Addr );
1576extern UInt VG_(helperc_LOADV4) ( Addr );
1577
1578extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1579extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1580extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1581
1582/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1583 space and pass the addresses and values of all addressible,
1584 defined, aligned words to notify_word. This is the basis for the
1585 leak detector. Returns the number of calls made to notify_word. */
1586UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1587
1588/* Is this address within some small distance below %ESP? Used only
1589 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001590extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001591
1592/* Nasty kludgery to deal with applications which switch stacks,
1593 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001594#define VG_PLAUSIBLE_STACK_SIZE 8000000
1595
sewardjc3bd5f52002-05-01 03:24:23 +00001596/* Needed by the pthreads implementation. */
1597#define VGM_WORD_VALID 0
1598#define VGM_WORD_INVALID 0xFFFFFFFF
1599
sewardjde4a1d02002-03-22 01:27:54 +00001600
1601/* ---------------------------------------------------------------------
1602 Exports of vg_syscall_mem.c
1603 ------------------------------------------------------------------ */
1604
sewardj2e93c502002-04-12 11:12:52 +00001605extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001606
sewardj2e93c502002-04-12 11:12:52 +00001607extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1608 Int syscallno,
1609 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001610
1611extern Bool VG_(is_kerror) ( Int res );
1612
sewardj018f7622002-05-15 21:13:39 +00001613#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1614 VG_(load_thread_state)(thread_id); \
1615 VG_(copy_baseBlock_to_m_state_static)(); \
1616 VG_(do_syscall)(); \
1617 VG_(copy_m_state_static_to_baseBlock)(); \
1618 VG_(save_thread_state)(thread_id); \
1619 VG_(threads)[thread_id].sh_eax = VGM_WORD_VALID; \
1620 result_lvalue = VG_(threads)[thread_id].m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001621
1622
1623/* ---------------------------------------------------------------------
1624 Exports of vg_transtab.c
1625 ------------------------------------------------------------------ */
1626
1627/* An entry in the translation table (TT). */
1628typedef
1629 struct {
1630 /* +0 */ Addr orig_addr;
1631 /* +4 */ Addr trans_addr;
1632 /* +8 */ UInt mru_epoch;
1633 /* +12 */ UShort orig_size;
1634 /* +14 */ UShort trans_size;
1635 }
1636 TTEntry;
1637
1638/* The number of basic blocks in an epoch (one age-step). */
1639#define VG_BBS_PER_EPOCH 20000
1640
1641extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1642extern void VG_(maybe_do_lru_pass) ( void );
1643extern void VG_(flush_transtab) ( void );
1644extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1645extern void VG_(add_to_trans_tab) ( TTEntry* tte );
sewardj18d75132002-05-16 11:06:21 +00001646extern void VG_(invalidate_translations) ( Addr start, UInt range );
sewardjde4a1d02002-03-22 01:27:54 +00001647
sewardj18d75132002-05-16 11:06:21 +00001648extern void VG_(init_tt_tc) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001649
1650extern void VG_(sanity_check_tc_tt) ( void );
1651extern Addr VG_(search_transtab) ( Addr original_addr );
1652
1653extern void VG_(invalidate_tt_fast)( void );
1654
1655
1656/* ---------------------------------------------------------------------
1657 Exports of vg_vtagops.c
1658 ------------------------------------------------------------------ */
1659
1660/* Lists the names of value-tag operations used in instrumented
1661 code. These are the third argument to TAG1 and TAG2 uinsns. */
1662
1663typedef
1664 enum {
1665 /* Unary. */
1666 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1667 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1668
1669 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1670
1671 VgT_Left4, VgT_Left2, VgT_Left1,
1672
1673 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1674 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1675
1676 /* Binary; 1st is rd; 2nd is rd+wr */
1677 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1678 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1679
1680 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1681 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1682 VgT_DebugFn
1683 }
1684 VgTagOp;
1685
1686extern Char* VG_(nameOfTagOp) ( VgTagOp );
1687extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1688
1689
1690/* ---------------------------------------------------------------------
1691 Exports of vg_syscall.S
1692 ------------------------------------------------------------------ */
1693
1694extern void VG_(do_syscall) ( void );
1695
1696
1697/* ---------------------------------------------------------------------
1698 Exports of vg_startup.S
1699 ------------------------------------------------------------------ */
1700
sewardjde4a1d02002-03-22 01:27:54 +00001701extern void VG_(switch_to_real_CPU) ( void );
1702
sewardj35805422002-04-21 13:05:34 +00001703extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1704 Addr m_esp_at_error,
1705 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001706
1707
1708/* ---------------------------------------------------------------------
1709 Exports of vg_dispatch.S
1710 ------------------------------------------------------------------ */
1711
sewardj2e93c502002-04-12 11:12:52 +00001712/* Run a thread for a (very short) while, until some event happens
1713 which means we need to defer to the scheduler. */
1714extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001715
1716
1717/* ---------------------------------------------------------------------
1718 Exports of vg_helpers.S
1719 ------------------------------------------------------------------ */
1720
sewardjde4a1d02002-03-22 01:27:54 +00001721/* Mul, div, etc, -- we don't codegen these directly. */
1722extern void VG_(helper_idiv_64_32);
1723extern void VG_(helper_div_64_32);
1724extern void VG_(helper_idiv_32_16);
1725extern void VG_(helper_div_32_16);
1726extern void VG_(helper_idiv_16_8);
1727extern void VG_(helper_div_16_8);
1728
1729extern void VG_(helper_imul_32_64);
1730extern void VG_(helper_mul_32_64);
1731extern void VG_(helper_imul_16_32);
1732extern void VG_(helper_mul_16_32);
1733extern void VG_(helper_imul_8_16);
1734extern void VG_(helper_mul_8_16);
1735
1736extern void VG_(helper_CLD);
1737extern void VG_(helper_STD);
1738extern void VG_(helper_get_dirflag);
1739
1740extern void VG_(helper_shldl);
1741extern void VG_(helper_shldw);
1742extern void VG_(helper_shrdl);
1743extern void VG_(helper_shrdw);
1744
1745extern void VG_(helper_RDTSC);
1746extern void VG_(helper_CPUID);
1747
sewardjde4a1d02002-03-22 01:27:54 +00001748extern void VG_(helper_bsf);
1749extern void VG_(helper_bsr);
1750
1751extern void VG_(helper_fstsw_AX);
1752extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001753extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001754extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001755
1756extern void VG_(helper_value_check4_fail);
1757extern void VG_(helper_value_check2_fail);
1758extern void VG_(helper_value_check1_fail);
1759extern void VG_(helper_value_check0_fail);
1760
sewardj20917d82002-05-28 01:36:45 +00001761/* NOT A FUNCTION; this is a bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001762extern void VG_(signalreturn_bogusRA)( void );
sewardj20917d82002-05-28 01:36:45 +00001763
sewardj54cacf02002-04-12 23:24:59 +00001764
njn4f9c9342002-04-29 16:03:24 +00001765/* ---------------------------------------------------------------------
1766 Exports of vg_cachesim.c
1767 ------------------------------------------------------------------ */
1768
1769extern UCodeBlock* VG_(cachesim_instrument)(UCodeBlock* cb_in, Addr orig_addr);
1770
1771typedef struct _iCC iCC;
1772typedef struct _idCC idCC;
1773
1774extern void VG_(init_cachesim) ( void );
1775extern void VG_(show_cachesim_results)( Int client_argc, Char** client_argv );
1776
1777extern void VG_(cachesim_log_non_mem_instr)( iCC* cc );
1778extern void VG_(cachesim_log_mem_instr) ( idCC* cc, Addr data_addr );
sewardjde4a1d02002-03-22 01:27:54 +00001779
sewardj18d75132002-05-16 11:06:21 +00001780extern void VG_(cachesim_notify_discard) ( TTEntry* tte );
1781
1782
sewardjde4a1d02002-03-22 01:27:54 +00001783/* ---------------------------------------------------------------------
1784 The state of the simulated CPU.
1785 ------------------------------------------------------------------ */
1786
1787/* This is the Intel register encoding. */
1788#define R_EAX 0
1789#define R_ECX 1
1790#define R_EDX 2
1791#define R_EBX 3
1792#define R_ESP 4
1793#define R_EBP 5
1794#define R_ESI 6
1795#define R_EDI 7
1796
1797#define R_AL (0+R_EAX)
1798#define R_CL (0+R_ECX)
1799#define R_DL (0+R_EDX)
1800#define R_BL (0+R_EBX)
1801#define R_AH (4+R_EAX)
1802#define R_CH (4+R_ECX)
1803#define R_DH (4+R_EDX)
1804#define R_BH (4+R_EBX)
1805
1806
1807/* ---------------------------------------------------------------------
1808 Offsets into baseBlock for everything which needs to referred to
1809 from generated code. The order of these decls does not imply
1810 what the order of the actual offsets is. The latter is important
1811 and is set up in vg_main.c.
1812 ------------------------------------------------------------------ */
1813
1814/* An array of words. In generated code, %ebp always points to the
1815 start of this array. Useful stuff, like the simulated CPU state,
1816 and the addresses of helper functions, can then be found by
1817 indexing off %ebp. The following declares variables which, at
1818 startup time, are given values denoting offsets into baseBlock.
1819 These offsets are in *words* from the start of baseBlock. */
1820
1821#define VG_BASEBLOCK_WORDS 200
1822
1823extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1824
1825
1826/* -----------------------------------------------------
1827 Read-write parts of baseBlock.
1828 -------------------------------------------------- */
1829
1830/* State of the simulated CPU. */
1831extern Int VGOFF_(m_eax);
1832extern Int VGOFF_(m_ecx);
1833extern Int VGOFF_(m_edx);
1834extern Int VGOFF_(m_ebx);
1835extern Int VGOFF_(m_esp);
1836extern Int VGOFF_(m_ebp);
1837extern Int VGOFF_(m_esi);
1838extern Int VGOFF_(m_edi);
1839extern Int VGOFF_(m_eflags);
1840extern Int VGOFF_(m_fpustate);
1841extern Int VGOFF_(m_eip);
1842
1843/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1844extern Int VGOFF_(spillslots);
1845
1846/* Records the valid bits for the 8 integer regs & flags reg. */
1847extern Int VGOFF_(sh_eax);
1848extern Int VGOFF_(sh_ecx);
1849extern Int VGOFF_(sh_edx);
1850extern Int VGOFF_(sh_ebx);
1851extern Int VGOFF_(sh_esp);
1852extern Int VGOFF_(sh_ebp);
1853extern Int VGOFF_(sh_esi);
1854extern Int VGOFF_(sh_edi);
1855extern Int VGOFF_(sh_eflags);
1856
1857
1858/* -----------------------------------------------------
1859 Read-only parts of baseBlock.
1860 -------------------------------------------------- */
1861
1862/* Offsets of addresses of helper functions. A "helper" function is
1863 one which is called from generated code. */
1864
1865extern Int VGOFF_(helper_idiv_64_32);
1866extern Int VGOFF_(helper_div_64_32);
1867extern Int VGOFF_(helper_idiv_32_16);
1868extern Int VGOFF_(helper_div_32_16);
1869extern Int VGOFF_(helper_idiv_16_8);
1870extern Int VGOFF_(helper_div_16_8);
1871
1872extern Int VGOFF_(helper_imul_32_64);
1873extern Int VGOFF_(helper_mul_32_64);
1874extern Int VGOFF_(helper_imul_16_32);
1875extern Int VGOFF_(helper_mul_16_32);
1876extern Int VGOFF_(helper_imul_8_16);
1877extern Int VGOFF_(helper_mul_8_16);
1878
1879extern Int VGOFF_(helper_CLD);
1880extern Int VGOFF_(helper_STD);
1881extern Int VGOFF_(helper_get_dirflag);
1882
1883extern Int VGOFF_(helper_shldl);
1884extern Int VGOFF_(helper_shldw);
1885extern Int VGOFF_(helper_shrdl);
1886extern Int VGOFF_(helper_shrdw);
1887
1888extern Int VGOFF_(helper_RDTSC);
1889extern Int VGOFF_(helper_CPUID);
1890
sewardjde4a1d02002-03-22 01:27:54 +00001891extern Int VGOFF_(helper_bsf);
1892extern Int VGOFF_(helper_bsr);
1893
1894extern Int VGOFF_(helper_fstsw_AX);
1895extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001896extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001897extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001898
1899extern Int VGOFF_(helper_value_check4_fail);
1900extern Int VGOFF_(helper_value_check2_fail);
1901extern Int VGOFF_(helper_value_check1_fail);
1902extern Int VGOFF_(helper_value_check0_fail);
1903
sewardjde4a1d02002-03-22 01:27:54 +00001904extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1905extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1906extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1907
1908extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1909extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1910extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1911
1912extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1913extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1914extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1915
njn4f9c9342002-04-29 16:03:24 +00001916extern Int VGOFF_(cachesim_log_non_mem_instr);
1917extern Int VGOFF_(cachesim_log_mem_instr);
sewardjde4a1d02002-03-22 01:27:54 +00001918
1919#endif /* ndef __VG_INCLUDE_H */
1920
sewardj3b2736a2002-03-24 12:18:35 +00001921
1922/* ---------------------------------------------------------------------
1923 Finally - autoconf-generated settings
1924 ------------------------------------------------------------------ */
1925
1926#include "config.h"
1927
sewardjde4a1d02002-03-22 01:27:54 +00001928/*--------------------------------------------------------------------*/
1929/*--- end vg_include.h ---*/
1930/*--------------------------------------------------------------------*/