blob: 9431c8e71a31e70b2ced769210cfe934f3220f7a [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. */
sewardjd8091eb2002-04-24 02:19:36 +0000126#define VG_SCHEDULING_QUANTUM 20000
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. */
sewardjebc82332002-04-24 14:44:23 +0000133#define VG_N_THREADS 50
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
sewardjde4a1d02002-03-22 01:27:54 +0000149
150/* ---------------------------------------------------------------------
151 Basic types
152 ------------------------------------------------------------------ */
153
154typedef unsigned char UChar;
155typedef unsigned short UShort;
156typedef unsigned int UInt;
157typedef unsigned long long int ULong;
158
159typedef signed char Char;
160typedef signed short Short;
161typedef signed int Int;
162typedef signed long long int Long;
163
164typedef unsigned int Addr;
165
166typedef unsigned char Bool;
167#define False ((Bool)0)
168#define True ((Bool)1)
169
170#define mycat_wrk(aaa,bbb) aaa##bbb
171#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
172
173/* Just pray that gcc's constant folding works properly ... */
174#define BITS(bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0) \
175 ( ((bit7) << 7) | ((bit6) << 6) | ((bit5) << 5) | ((bit4) << 4) \
176 | ((bit3) << 3) | ((bit2) << 2) | ((bit1) << 1) | (bit0))
177
178
179/* ---------------------------------------------------------------------
180 Now the basic types are set up, we can haul in the kernel-interface
181 definitions.
182 ------------------------------------------------------------------ */
183
184#include "./vg_kerneliface.h"
185
186
187/* ---------------------------------------------------------------------
188 Command-line-settable options
189 ------------------------------------------------------------------ */
190
191#define VG_CLO_SMC_NONE 0
192#define VG_CLO_SMC_SOME 1
193#define VG_CLO_SMC_ALL 2
194
195#define VG_CLO_MAX_SFILES 10
196
sewardj97ced732002-03-25 00:07:36 +0000197/* Shall we V-check addrs (they are always A checked too): default: YES */
198extern Bool VG_(clo_check_addrVs);
sewardjde4a1d02002-03-22 01:27:54 +0000199/* Enquire about whether to attach to GDB at errors? default: NO */
200extern Bool VG_(clo_GDB_attach);
201/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
202extern Int VG_(sanity_level);
203/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
204extern Int VG_(clo_verbosity);
205/* Automatically attempt to demangle C++ names? default: YES */
206extern Bool VG_(clo_demangle);
207/* Do leak check at exit? default: NO */
208extern Bool VG_(clo_leak_check);
209/* In leak check, show reachable-but-not-freed blocks? default: NO */
210extern Bool VG_(clo_show_reachable);
211/* How closely should we compare ExeContexts in leak records? default: 2 */
212extern Int VG_(clo_leak_resolution);
213/* Round malloc sizes upwards to integral number of words? default:
214 NO */
215extern Bool VG_(clo_sloppy_malloc);
216/* Allow loads from partially-valid addresses? default: YES */
217extern Bool VG_(clo_partial_loads_ok);
218/* Simulate child processes? default: NO */
219extern Bool VG_(clo_trace_children);
220/* The file id on which we send all messages. default: 2 (stderr). */
221extern Int VG_(clo_logfile_fd);
222/* Max volume of the freed blocks queue. */
223extern Int VG_(clo_freelist_vol);
224/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
225 default: NO */
226extern Bool VG_(clo_workaround_gcc296_bugs);
227
228/* The number of suppression files specified. */
229extern Int VG_(clo_n_suppressions);
230/* The names of the suppression files. */
231extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
232
233/* Single stepping? default: NO */
234extern Bool VG_(clo_single_step);
235/* Code improvement? default: YES */
236extern Bool VG_(clo_optimise);
237/* Memory-check instrumentation? default: YES */
238extern Bool VG_(clo_instrument);
239/* DEBUG: clean up instrumented code? default: YES */
240extern Bool VG_(clo_cleanup);
njn4f9c9342002-04-29 16:03:24 +0000241/* Cache simulation instrumentation? default: NO */
242extern Bool VG_(clo_cachesim);
sewardjde4a1d02002-03-22 01:27:54 +0000243/* SMC write checks? default: SOME (1,2,4 byte movs to mem) */
244extern Int VG_(clo_smc_check);
245/* DEBUG: print system calls? default: NO */
246extern Bool VG_(clo_trace_syscalls);
247/* DEBUG: print signal details? default: NO */
248extern Bool VG_(clo_trace_signals);
249/* DEBUG: print symtab details? default: NO */
250extern Bool VG_(clo_trace_symtab);
251/* DEBUG: print malloc details? default: NO */
252extern Bool VG_(clo_trace_malloc);
sewardj8937c812002-04-12 20:12:20 +0000253/* DEBUG: print thread scheduling events? default: NO */
254extern Bool VG_(clo_trace_sched);
sewardj45b4b372002-04-16 22:50:32 +0000255/* DEBUG: print pthread (mutex etc) events? default: 0 (none), 1
256 (some), 2 (all) */
257extern Int VG_(clo_trace_pthread_level);
sewardjde4a1d02002-03-22 01:27:54 +0000258/* Stop after this many basic blocks. default: Infinity. */
259extern ULong VG_(clo_stop_after);
260/* Display gory details for the k'th most popular error. default:
261 Infinity. */
262extern Int VG_(clo_dump_error);
263/* Number of parents of a backtrace. Default: 8. */
264extern Int VG_(clo_backtrace_size);
sewardj3984b852002-05-12 03:00:17 +0000265/* Engage miscellaneous wierd hacks needed for some progs. */
sewardj8d365b52002-05-12 10:52:16 +0000266extern Char* VG_(clo_weird_hacks);
sewardjde4a1d02002-03-22 01:27:54 +0000267
268
269/* ---------------------------------------------------------------------
270 Debugging and profiling stuff
271 ------------------------------------------------------------------ */
272
273/* No, really. I _am_ that strange. */
274#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
275
276/* Tools for building messages from multiple parts. */
277typedef
278 enum { Vg_UserMsg, Vg_DebugMsg, Vg_DebugExtraMsg }
279 VgMsgKind;
280
281extern void VG_(start_msg) ( VgMsgKind kind );
282extern void VG_(add_to_msg) ( Char* format, ... );
283extern void VG_(end_msg) ( void );
284
285/* Send a simple, single-part message. */
286extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
287
288/* Create a logfile into which messages can be dumped. */
289extern void VG_(startup_logging) ( void );
290extern void VG_(shutdown_logging) ( void );
291
292
293/* Profiling stuff */
294#ifdef VG_PROFILE
295
296#define VGP_M_STACK 10
297
sewardj671ff542002-05-07 09:25:30 +0000298#define VGP_M_CCS 26 /* == the # of elems in VGP_LIST */
sewardjde4a1d02002-03-22 01:27:54 +0000299#define VGP_LIST \
sewardj671ff542002-05-07 09:25:30 +0000300 VGP_PAIR(VgpUnc=0, "unclassified"), \
301 VGP_PAIR(VgpRun, "running"), \
302 VGP_PAIR(VgpSched, "scheduler"), \
sewardjde4a1d02002-03-22 01:27:54 +0000303 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
304 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
305 VGP_PAIR(VgpTranslate, "translate-main"), \
306 VGP_PAIR(VgpToUCode, "to-ucode"), \
307 VGP_PAIR(VgpFromUcode, "from-ucode"), \
308 VGP_PAIR(VgpImprove, "improve"), \
309 VGP_PAIR(VgpInstrument, "instrument"), \
310 VGP_PAIR(VgpCleanup, "cleanup"), \
311 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
312 VGP_PAIR(VgpDoLRU, "do-lru"), \
313 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
314 VGP_PAIR(VgpInitAudit, "init-mem-audit"), \
315 VGP_PAIR(VgpExeContext, "exe-context"), \
316 VGP_PAIR(VgpReadSyms, "read-syms"), \
317 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
318 VGP_PAIR(VgpSARP, "set-addr-range-perms"), \
319 VGP_PAIR(VgpSyscall, "syscall wrapper"), \
njn4f9c9342002-04-29 16:03:24 +0000320 VGP_PAIR(VgpCacheInstrument, "cache instrument"), \
321 VGP_PAIR(VgpCacheGetBBCC,"cache get BBCC"), \
322 VGP_PAIR(VgpCacheSimulate, "cache simulate"), \
323 VGP_PAIR(VgpCacheDump, "cache stats dump"), \
sewardjde4a1d02002-03-22 01:27:54 +0000324 VGP_PAIR(VgpSpare1, "spare 1"), \
325 VGP_PAIR(VgpSpare2, "spare 2")
326
327#define VGP_PAIR(enumname,str) enumname
328typedef enum { VGP_LIST } VgpCC;
329#undef VGP_PAIR
330
331extern void VGP_(init_profiling) ( void );
332extern void VGP_(done_profiling) ( void );
333extern void VGP_(pushcc) ( VgpCC );
334extern void VGP_(popcc) ( void );
335
336#define VGP_PUSHCC(cc) VGP_(pushcc)(cc)
337#define VGP_POPCC VGP_(popcc)()
338
339#else
340
341#define VGP_PUSHCC(cc) /* */
342#define VGP_POPCC /* */
343
344#endif /* VG_PROFILE */
345
346
347/* ---------------------------------------------------------------------
348 Exports of vg_malloc2.c
349 ------------------------------------------------------------------ */
350
351/* Allocation arenas.
352 SYMTAB is for Valgrind's symbol table storage.
353 CLIENT is for the client's mallocs/frees.
354 DEMANGLE is for the C++ demangler.
355 EXECTXT is for storing ExeContexts.
356 ERRCTXT is for storing ErrContexts.
357 PRIVATE is for Valgrind general stuff.
358 TRANSIENT is for very short-term use. It should be empty
359 in between uses.
360 When adding a new arena, remember also to add it
361 to ensure_mm_init().
362*/
363typedef Int ArenaId;
364
365#define VG_N_ARENAS 7
366
367#define VG_AR_PRIVATE 0 /* :: ArenaId */
368#define VG_AR_SYMTAB 1 /* :: ArenaId */
369#define VG_AR_CLIENT 2 /* :: ArenaId */
370#define VG_AR_DEMANGLE 3 /* :: ArenaId */
371#define VG_AR_EXECTXT 4 /* :: ArenaId */
372#define VG_AR_ERRCTXT 5 /* :: ArenaId */
373#define VG_AR_TRANSIENT 6 /* :: ArenaId */
374
375extern void* VG_(malloc) ( ArenaId arena, Int nbytes );
376extern void VG_(free) ( ArenaId arena, void* ptr );
377extern void* VG_(calloc) ( ArenaId arena, Int nmemb, Int nbytes );
378extern void* VG_(realloc) ( ArenaId arena, void* ptr, Int size );
379extern void* VG_(malloc_aligned) ( ArenaId aid, Int req_alignB,
380 Int req_pszB );
381
382extern void VG_(mallocSanityCheckArena) ( ArenaId arena );
383extern void VG_(mallocSanityCheckAll) ( void );
384
385extern void VG_(show_all_arena_stats) ( void );
386extern Bool VG_(is_empty_arena) ( ArenaId aid );
387
388
389/* The red-zone size for the client. This can be arbitrary, but
390 unfortunately must be set at compile time. */
391#define VG_AR_CLIENT_REDZONE_SZW 4
392
393#define VG_AR_CLIENT_REDZONE_SZB \
394 (VG_AR_CLIENT_REDZONE_SZW * VKI_BYTES_PER_WORD)
395
396
397/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000398 Exports of vg_clientfuns.c
399 ------------------------------------------------------------------ */
400
401/* This doesn't export code or data that valgrind.so needs to link
402 against. However, the scheduler does need to know the following
403 request codes. A few, publically-visible, request codes are also
404 defined in valgrind.h. */
405
406#define VG_USERREQ__MALLOC 0x2001
407#define VG_USERREQ__BUILTIN_NEW 0x2002
408#define VG_USERREQ__BUILTIN_VEC_NEW 0x2003
409
410#define VG_USERREQ__FREE 0x2004
411#define VG_USERREQ__BUILTIN_DELETE 0x2005
412#define VG_USERREQ__BUILTIN_VEC_DELETE 0x2006
413
414#define VG_USERREQ__CALLOC 0x2007
415#define VG_USERREQ__REALLOC 0x2008
416#define VG_USERREQ__MEMALIGN 0x2009
417
418
419#define VG_USERREQ__PTHREAD_CREATE 0x3001
sewardjbc5b99f2002-04-13 00:08:51 +0000420#define VG_USERREQ__PTHREAD_JOIN 0x3002
421#define VG_USERREQ__PTHREAD_GET_THREADID 0x3003
sewardj3b5d8862002-04-20 13:53:23 +0000422#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x3004
sewardj30671ff2002-04-21 00:13:57 +0000423#define VG_USERREQ__PTHREAD_MUTEX_TRYLOCK 0x3005
424#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x3006
425#define VG_USERREQ__PTHREAD_CANCEL 0x3007
426#define VG_USERREQ__PTHREAD_EXIT 0x3008
427#define VG_USERREQ__PTHREAD_COND_WAIT 0x3009
sewardj5f07b662002-04-23 16:52:51 +0000428#define VG_USERREQ__PTHREAD_COND_TIMEDWAIT 0x300A
429#define VG_USERREQ__PTHREAD_COND_SIGNAL 0x300B
430#define VG_USERREQ__PTHREAD_COND_BROADCAST 0x300C
431#define VG_USERREQ__PTHREAD_KEY_CREATE 0x300D
432#define VG_USERREQ__PTHREAD_KEY_DELETE 0x300E
433#define VG_USERREQ__PTHREAD_SETSPECIFIC 0x300F
434#define VG_USERREQ__PTHREAD_GETSPECIFIC 0x3010
sewardj56fc53d2002-04-24 01:17:42 +0000435#define VG_USERREQ__READ_MILLISECOND_TIMER 0x3011
sewardjb48e5002002-05-13 00:16:03 +0000436#define VG_USERREQ__PTHREAD_SIGMASK 0x3012
437#define VG_USERREQ__SIGWAIT 0x3013
sewardj018f7622002-05-15 21:13:39 +0000438#define VG_USERREQ__PTHREAD_KILL 0x3014
sewardjff42d1d2002-05-22 13:17:31 +0000439#define VG_USERREQ__PTHREAD_YIELD 0x3015
sewardj2e93c502002-04-12 11:12:52 +0000440
sewardj45b4b372002-04-16 22:50:32 +0000441/* Cosmetic ... */
442#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
443
sewardj54cacf02002-04-12 23:24:59 +0000444/*
445In vg_constants.h:
446#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardjbc5b99f2002-04-13 00:08:51 +0000447#define VG_USERREQ__PTHREAD_RETURNS 0x4002
sewardj54cacf02002-04-12 23:24:59 +0000448*/
449
450
sewardj2e93c502002-04-12 11:12:52 +0000451/* ---------------------------------------------------------------------
452 Constants pertaining to the simulated CPU state, VG_(baseBlock),
453 which need to go here to avoid ugly circularities.
454 ------------------------------------------------------------------ */
455
456/* How big is the saved FPU state? */
457#define VG_SIZE_OF_FPUSTATE 108
458/* ... and in words ... */
459#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
460
461
462/* ---------------------------------------------------------------------
463 Exports of vg_scheduler.c
464 ------------------------------------------------------------------ */
465
466/* ThreadIds are simply indices into the vg_threads[] array. */
467typedef
468 UInt
469 ThreadId;
470
sewardj6072c362002-04-19 14:40:57 +0000471/* Special magic value for an invalid ThreadId. It corresponds to
472 LinuxThreads using zero as the initial value for
473 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
474#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000475
476typedef
477 enum {
478 VgTs_Empty, /* this slot is not in use */
479 VgTs_Runnable, /* waiting to be scheduled */
480 VgTs_WaitJoiner, /* waiting for someone to do join on me */
481 VgTs_WaitJoinee, /* waiting for the thread I did join on */
482 VgTs_WaitFD, /* waiting for I/O completion on a fd */
483 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000484 VgTs_WaitCV, /* waiting on a condition variable */
sewardjb48e5002002-05-13 00:16:03 +0000485 VgTs_WaitSIG, /* waiting due to sigwait() */
sewardj2e93c502002-04-12 11:12:52 +0000486 VgTs_Sleeping /* sleeping for a while */
487 }
488 ThreadStatus;
489
490typedef
491 struct {
sewardj6072c362002-04-19 14:40:57 +0000492 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
493 The thread identity is simply the index in vg_threads[].
494 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000495 that we don't try and allocate or deallocate its stack. For
496 convenience of generating error message, we also put the
497 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000498 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000499 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000500
sewardj5f07b662002-04-23 16:52:51 +0000501 /* Current scheduling status.
502
503 Complications: whenever this is set to VgTs_WaitMX, you
504 should also set .m_edx to whatever the required return value
505 is for pthread_mutex_lock / pthread_cond_timedwait for when
506 the mutex finally gets unblocked. */
sewardj2e93c502002-04-12 11:12:52 +0000507 ThreadStatus status;
508
509 /* Identity of joiner (thread who called join on me), or
510 VG_INVALID_THREADID if no one asked to join yet. */
511 ThreadId joiner;
512
sewardj3b5d8862002-04-20 13:53:23 +0000513 /* When .status == WaitMX, points to the mutex I am waiting for.
514 When .status == WaitCV, points to the mutex associated with
515 the condition variable indicated by the .associated_cv field.
516 In all other cases, should be NULL. */
517 void* /* pthread_mutex_t* */ associated_mx;
518
519 /* When .status == WaitCV, points to the condition variable I am
520 waiting for. In all other cases, should be NULL. */
521 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000522
sewardj5f07b662002-04-23 16:52:51 +0000523 /* If VgTs_Sleeping, this is when we should wake up, measured in
524 milliseconds as supplied by VG_(read_millisecond_counter).
525
526 If VgTs_WaitCV, this indicates the time at which
527 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
528 this means infinitely far in the future, viz,
529 pthread_cond_wait. */
530 UInt awaken_at;
sewardj2e93c502002-04-12 11:12:52 +0000531
532 /* return value */
533 void* retval;
534
sewardj5f07b662002-04-23 16:52:51 +0000535 /* thread-specific data */
536 void* specifics[VG_N_THREAD_KEYS];
537
sewardjb48e5002002-05-13 00:16:03 +0000538 /* This thread's blocked-signals mask. Semantics is that for a
539 signal to be delivered to this thread, the signal must not be
540 blocked by either the process-wide signal mask nor by this
541 one. So, if this thread is prepared to handle any signal that
542 the process as a whole is prepared to handle, this mask should
543 be made empty -- and that it is its default, starting
544 state. */
545 vki_ksigset_t sig_mask;
546
547 /* When not VgTs_WaitSIG, has no meaning. When VgTs_WaitSIG,
548 is the set of signals for which we are sigwait()ing. */
549 vki_ksigset_t sigs_waited_for;
550
sewardj2e93c502002-04-12 11:12:52 +0000551 /* Stacks. When a thread slot is freed, we don't deallocate its
552 stack; we just leave it lying around for the next use of the
553 slot. If the next use of the slot requires a larger stack,
554 only then is the old one deallocated and a new one
555 allocated.
556
557 For the main thread (threadid == 0), this mechanism doesn't
558 apply. We don't know the size of the stack since we didn't
559 allocate it, and furthermore we never reallocate it. */
560
561 /* The allocated size of this thread's stack (permanently zero
562 if this is ThreadId == 0, since we didn't allocate its stack) */
563 UInt stack_size;
564
565 /* Address of the lowest word in this thread's stack. NULL means
566 not allocated yet.
567 */
568 Addr stack_base;
569
sewardj1e8cdc92002-04-18 11:37:52 +0000570 /* Address of the highest legitimate word in this stack. This is
571 used for error messages only -- not critical for execution
572 correctness. Is is set for all stacks, specifically including
573 ThreadId == 0 (the main thread). */
574 Addr stack_highest_word;
575
sewardj2e93c502002-04-12 11:12:52 +0000576 /* Saved machine context. */
577 UInt m_eax;
578 UInt m_ebx;
579 UInt m_ecx;
580 UInt m_edx;
581 UInt m_esi;
582 UInt m_edi;
583 UInt m_ebp;
584 UInt m_esp;
585 UInt m_eflags;
586 UInt m_eip;
587 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
588
589 UInt sh_eax;
590 UInt sh_ebx;
591 UInt sh_ecx;
592 UInt sh_edx;
593 UInt sh_esi;
594 UInt sh_edi;
595 UInt sh_ebp;
596 UInt sh_esp;
597 UInt sh_eflags;
598 }
599 ThreadState;
600
601
sewardj018f7622002-05-15 21:13:39 +0000602/* The thread table. */
603extern ThreadState VG_(threads)[VG_N_THREADS];
604
605/* Check that tid is in range and denotes a non-Empty thread. */
sewardjb48e5002002-05-13 00:16:03 +0000606extern Bool VG_(is_valid_tid) ( ThreadId tid );
607
sewardj018f7622002-05-15 21:13:39 +0000608/* Check that tid is in range. */
609extern Bool VG_(is_valid_or_empty_tid) ( ThreadId tid );
610
sewardj2e93c502002-04-12 11:12:52 +0000611/* Copy the specified thread's state into VG_(baseBlock) in
612 preparation for running it. */
613extern void VG_(load_thread_state)( ThreadId );
614
615/* Save the specified thread's state back in VG_(baseBlock), and fill
616 VG_(baseBlock) with junk, for sanity-check reasons. */
617extern void VG_(save_thread_state)( ThreadId );
618
sewardj1e8cdc92002-04-18 11:37:52 +0000619/* And for the currently running one, if valid. */
620extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000621
sewardj1e8cdc92002-04-18 11:37:52 +0000622/* Similarly ... */
623extern ThreadId VG_(get_current_tid) ( void );
624
625/* Which thread is this address in the stack of, if any? Used for
626 error message generation. */
627extern ThreadId VG_(identify_stack_addr)( Addr a );
628
sewardj2e93c502002-04-12 11:12:52 +0000629
630/* Return codes from the scheduler. */
631typedef
sewardj7e87e382002-05-03 19:09:05 +0000632 enum {
633 VgSrc_Deadlock, /* no runnable threads and no prospect of any
634 even if we wait for a long time */
635 VgSrc_ExitSyscall, /* client called exit(). This is the normal
636 route out. */
637 VgSrc_BbsDone /* In a debugging run, the specified number of
638 bbs has been completed. */
639 }
sewardj2e93c502002-04-12 11:12:52 +0000640 VgSchedReturnCode;
641
sewardj7e87e382002-05-03 19:09:05 +0000642
sewardj2e93c502002-04-12 11:12:52 +0000643/* The scheduler. */
644extern VgSchedReturnCode VG_(scheduler) ( void );
645
646extern void VG_(scheduler_init) ( void );
647
sewardj15a43e12002-04-17 19:35:12 +0000648extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000649
650/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
651extern jmp_buf VG_(scheduler_jmpbuf);
652/* ... and if so, here's the signal which caused it to do so. */
653extern Int VG_(longjmpd_on_signal);
654
655
sewardja1679dd2002-05-10 22:31:40 +0000656/* Possible places where the main stack might be based. We check that
657 the initial stack, which we can't move, is allocated here.
658 VG_(scheduler_init) checks this. Andrea Archelangi's 2.4 kernels
659 have been rumoured to start stacks at 0x80000000, so that too is
660 considered.
sewardj2e93c502002-04-12 11:12:52 +0000661*/
sewardja1679dd2002-05-10 22:31:40 +0000662#define VG_STARTUP_STACK_BASE_1 (Addr)0xC0000000
663#define VG_STARTUP_STACK_BASE_2 (Addr)0x80000000
664#define VG_STARTUP_STACK_SMALLERTHAN 0x100000 /* 1024k */
665
666#define VG_STACK_MATCHES_BASE(zzstack, zzbase) \
667 ( \
668 ((zzstack) & ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN)) \
669 == \
670 ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN) \
671 )
sewardj2e93c502002-04-12 11:12:52 +0000672
673
674/* The red-zone size which we put at the bottom (highest address) of
675 thread stacks, for paranoia reasons. This can be arbitrary, and
676 doesn't really need to be set at compile time. */
677#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
678
679#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
680 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
681
682
sewardj018f7622002-05-15 21:13:39 +0000683/* Write a value to the client's %EDX (request return value register)
684 and set the shadow to indicate it is defined. */
685#define SET_EDX(zztid, zzval) \
686 do { VG_(threads)[zztid].m_edx = (zzval); \
687 VG_(threads)[zztid].sh_edx = VGM_WORD_VALID; \
688 } while (0)
689
690#define SET_EAX(zztid, zzval) \
691 do { VG_(threads)[zztid].m_eax = (zzval); \
692 VG_(threads)[zztid].sh_eax = VGM_WORD_VALID; \
693 } while (0)
694
sewardj2e93c502002-04-12 11:12:52 +0000695
696/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000697 Exports of vg_signals.c
698 ------------------------------------------------------------------ */
699
sewardjde4a1d02002-03-22 01:27:54 +0000700extern void VG_(sigstartup_actions) ( void );
701
sewardjb48e5002002-05-13 00:16:03 +0000702extern Bool VG_(deliver_signals) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000703extern void VG_(unblock_host_signal) ( Int sigNo );
sewardj018f7622002-05-15 21:13:39 +0000704extern void VG_(handle_SCSS_change) ( Bool force_update );
705
sewardjde4a1d02002-03-22 01:27:54 +0000706
707/* Fake system calls for signal handling. */
sewardj2342c972002-05-22 23:34:20 +0000708extern void VG_(do__NR_sigaltstack) ( ThreadId tid );
sewardj2e93c502002-04-12 11:12:52 +0000709extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardj018f7622002-05-15 21:13:39 +0000710extern void VG_(do__NR_sigprocmask) ( ThreadId tid,
711 Int how,
712 vki_ksigset_t* set,
713 vki_ksigset_t* oldset );
714extern void VG_(do_pthread_sigmask_SCSS_upd) ( ThreadId tid,
715 Int how,
716 vki_ksigset_t* set,
717 vki_ksigset_t* oldset );
718extern void VG_(send_signal_to_thread) ( ThreadId thread,
719 Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000720
sewardj2e93c502002-04-12 11:12:52 +0000721/* Modify the current thread's state once we have detected it is
722 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000723extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000724
sewardj2e93c502002-04-12 11:12:52 +0000725/* Handy utilities to block/restore all host signals. */
726extern void VG_(block_all_host_signals)
727 ( /* OUT */ vki_ksigset_t* saved_mask );
sewardj018f7622002-05-15 21:13:39 +0000728extern void VG_(restore_all_host_signals)
sewardj2e93c502002-04-12 11:12:52 +0000729 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000730
731/* ---------------------------------------------------------------------
732 Exports of vg_mylibc.c
733 ------------------------------------------------------------------ */
734
735
sewardjfbe18b92002-05-10 00:46:59 +0000736#if !defined(NULL)
737# define NULL ((void*)0)
738#endif
sewardjde4a1d02002-03-22 01:27:54 +0000739
740extern void VG_(exit)( Int status )
741 __attribute__ ((__noreturn__));
742
743extern void VG_(printf) ( const char *format, ... );
744/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
745
746extern void VG_(sprintf) ( Char* buf, Char *format, ... );
747
748extern void VG_(vprintf) ( void(*send)(Char),
749 const Char *format, va_list vargs );
750
751extern Bool VG_(isspace) ( Char c );
752
753extern Int VG_(strlen) ( const Char* str );
754
755extern Long VG_(atoll) ( Char* str );
756
757extern Char* VG_(strcat) ( Char* dest, const Char* src );
758extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
759extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
760
761extern Char* VG_(strcpy) ( Char* dest, const Char* src );
762
763extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
764extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
765
766extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
767extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
768
769extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
770extern Char* VG_(strchr) ( const Char* s, Char c );
771extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
772
773extern Char* VG_(getenv) ( Char* name );
774extern Int VG_(getpid) ( void );
sewardj5f07b662002-04-23 16:52:51 +0000775
776extern void VG_(start_rdtsc_calibration) ( void );
777extern void VG_(end_rdtsc_calibration) ( void );
778extern UInt VG_(read_millisecond_timer) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000779
780
781extern Char VG_(toupper) ( Char c );
782
783extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
784
785extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
786
787extern Bool VG_(stringMatch) ( Char* pat, Char* str );
788
789
sewardj3e1eb1f2002-05-18 13:14:17 +0000790#define VG__STRING(__str) #__str
sewardjde4a1d02002-03-22 01:27:54 +0000791
792/* Asserts are permanently enabled. Hurrah! */
793#define vg_assert(expr) \
794 ((void) ((expr) ? 0 : \
sewardj3e1eb1f2002-05-18 13:14:17 +0000795 (VG_(assert_fail) (VG__STRING(expr), \
sewardjde4a1d02002-03-22 01:27:54 +0000796 __FILE__, __LINE__, \
797 __PRETTY_FUNCTION__), 0)))
798
799extern void VG_(assert_fail) ( Char* expr, Char* file,
800 Int line, Char* fn )
801 __attribute__ ((__noreturn__));
802
njn4f9c9342002-04-29 16:03:24 +0000803/* Reading and writing files. */
sewardjde4a1d02002-03-22 01:27:54 +0000804extern Int VG_(open_read) ( Char* pathname );
njn4f9c9342002-04-29 16:03:24 +0000805extern Int VG_(open_write) ( Char* pathname );
806extern Int VG_(create_and_write) ( Char* pathname );
sewardjde4a1d02002-03-22 01:27:54 +0000807extern void VG_(close) ( Int fd );
808extern Int VG_(read) ( Int fd, void* buf, Int count);
809extern Int VG_(write) ( Int fd, void* buf, Int count);
sewardjb3586202002-05-09 17:38:13 +0000810extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
sewardjde4a1d02002-03-22 01:27:54 +0000811
sewardj2e93c502002-04-12 11:12:52 +0000812extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
813
814extern Int VG_(select)( Int n,
815 vki_fd_set* readfds,
816 vki_fd_set* writefds,
817 vki_fd_set* exceptfds,
818 struct vki_timeval * timeout );
819extern Int VG_(nanosleep)( const struct vki_timespec *req,
820 struct vki_timespec *rem );
821
822
sewardjde4a1d02002-03-22 01:27:54 +0000823/* mmap-ery ... */
824extern void* VG_(mmap)( void* start, UInt length,
825 UInt prot, UInt flags, UInt fd, UInt offset );
826
sewardj2e93c502002-04-12 11:12:52 +0000827extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000828
sewardjb3586202002-05-09 17:38:13 +0000829extern void* VG_(brk) ( void* end_data_segment );
830
sewardjde4a1d02002-03-22 01:27:54 +0000831
832/* Print a (panic) message, and abort. */
833extern void VG_(panic) ( Char* str )
834 __attribute__ ((__noreturn__));
835
836/* Get memory by anonymous mmap. */
sewardje6a25242002-04-21 22:03:07 +0000837extern void* VG_(get_memory_from_mmap) ( Int nBytes );
838
839/* Crude stand-in for the glibc system() call. */
840extern Int VG_(system) ( Char* cmd );
841
sewardjde4a1d02002-03-22 01:27:54 +0000842
843/* Signal stuff. Note that these use the vk_ (kernel) structure
844 definitions, which are different in places from those that glibc
845 defines. Since we're operating right at the kernel interface,
846 glibc's view of the world is entirely irrelevant. */
sewardj018f7622002-05-15 21:13:39 +0000847
848/* --- Signal set ops --- */
sewardjb48e5002002-05-13 00:16:03 +0000849extern Int VG_(ksigfillset)( vki_ksigset_t* set );
850extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
sewardjde4a1d02002-03-22 01:27:54 +0000851
sewardj018f7622002-05-15 21:13:39 +0000852extern Bool VG_(kisfullsigset)( vki_ksigset_t* set );
853extern Bool VG_(kisemptysigset)( vki_ksigset_t* set );
854
855extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
856extern Int VG_(ksigdelset)( vki_ksigset_t* set, Int signum );
857extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
858
sewardjb48e5002002-05-13 00:16:03 +0000859extern void VG_(ksigaddset_from_set)( vki_ksigset_t* dst,
860 vki_ksigset_t* src );
861extern void VG_(ksigdelset_from_set)( vki_ksigset_t* dst,
862 vki_ksigset_t* src );
863
sewardj018f7622002-05-15 21:13:39 +0000864/* --- Mess with the kernel's sig state --- */
865extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
866 vki_ksigset_t* oldset );
867extern Int VG_(ksigaction) ( Int signum,
868 const vki_ksigaction* act,
869 vki_ksigaction* oldact );
sewardjde4a1d02002-03-22 01:27:54 +0000870
871extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
872
873extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
874
sewardj018f7622002-05-15 21:13:39 +0000875extern Int VG_(kill)( Int pid, Int signo );
sewardjde4a1d02002-03-22 01:27:54 +0000876
877
878/* ---------------------------------------------------------------------
879 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
880 vg_from_ucode.c).
881 ------------------------------------------------------------------ */
882
883/* Tags which describe what operands are. */
884typedef
885 enum { TempReg=0, ArchReg=1, RealReg=2,
886 SpillNo=3, Literal=4, Lit16=5,
887 NoValue=6 }
888 Tag;
889
890
891/* Microinstruction opcodes. */
892typedef
893 enum {
894 NOP,
895 GET,
896 PUT,
897 LOAD,
898 STORE,
899 MOV,
900 CMOV, /* Used for cmpxchg and cmov */
901 WIDEN,
902 JMP,
903
904 /* Read/write the %EFLAGS register into a TempReg. */
905 GETF, PUTF,
906
907 ADD, ADC, AND, OR, XOR, SUB, SBB,
908 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
909 NOT, NEG, INC, DEC, BSWAP,
910 CC2VAL,
911
912 /* Not strictly needed, but useful for making better
913 translations of address calculations. */
914 LEA1, /* reg2 := const + reg1 */
915 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
916
917 /* not for translating x86 calls -- only to call helpers */
918 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
919 for CALLM. */
920 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
921 CALLM, /* call to a machine-code helper */
922
923 /* Hack for translating string (REP-) insns. Jump to literal if
924 TempReg/RealReg is zero. */
925 JIFZ,
926
927 /* FPU ops which read/write mem or don't touch mem at all. */
928 FPU_R,
929 FPU_W,
930 FPU,
931
932 /* Advance the simulated %eip by some small (< 128) number. */
933 INCEIP,
934
935 /* uinstrs which are not needed for mere translation of x86 code,
936 only for instrumentation of it. */
937 LOADV,
938 STOREV,
939 GETV,
940 PUTV,
941 TESTV,
942 SETV,
943 /* Get/set the v-bit (and it is only one bit) for the simulated
944 %eflags register. */
945 GETVF,
946 PUTVF,
947
948 /* Do a unary or binary tag op. Only for post-instrumented
949 code. For TAG1, first and only arg is a TempReg, and is both
950 arg and result reg. For TAG2, first arg is src, second is
951 dst, in the normal way; both are TempRegs. In both cases,
952 3rd arg is a RiCHelper with a Lit16 tag. This indicates
953 which tag op to do. */
954 TAG1,
955 TAG2
956 }
957 Opcode;
958
959
960/* Condition codes, observing the Intel encoding. CondAlways is an
961 extra. */
962typedef
963 enum {
964 CondO = 0, /* overflow */
965 CondNO = 1, /* no overflow */
966 CondB = 2, /* below */
967 CondNB = 3, /* not below */
968 CondZ = 4, /* zero */
969 CondNZ = 5, /* not zero */
970 CondBE = 6, /* below or equal */
971 CondNBE = 7, /* not below or equal */
972 CondS = 8, /* negative */
973 ConsNS = 9, /* not negative */
974 CondP = 10, /* parity even */
975 CondNP = 11, /* not parity even */
976 CondL = 12, /* jump less */
977 CondNL = 13, /* not less */
978 CondLE = 14, /* less or equal */
979 CondNLE = 15, /* not less or equal */
980 CondAlways = 16 /* Jump always */
981 }
982 Condcode;
983
984
sewardj2e93c502002-04-12 11:12:52 +0000985/* Descriptions of additional properties of *unconditional* jumps. */
986typedef
987 enum {
988 JmpBoring=0, /* boring unconditional jump */
989 JmpCall=1, /* jump due to an x86 call insn */
990 JmpRet=2, /* jump due to an x86 ret insn */
991 JmpSyscall=3, /* do a system call, then jump */
992 JmpClientReq=4 /* do a client request, then jump */
993 }
994 JmpKind;
995
996
sewardjde4a1d02002-03-22 01:27:54 +0000997/* Flags. User-level code can only read/write O(verflow), S(ign),
998 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
999 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
1000 thusly:
1001 76543210
1002 DOSZACP
1003 and bit 7 must always be zero since it is unused.
1004*/
1005typedef UChar FlagSet;
1006
1007#define FlagD (1<<6)
1008#define FlagO (1<<5)
1009#define FlagS (1<<4)
1010#define FlagZ (1<<3)
1011#define FlagA (1<<2)
1012#define FlagC (1<<1)
1013#define FlagP (1<<0)
1014
1015#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
1016#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
1017#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
1018#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
1019#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
1020#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +00001021#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +00001022#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +00001023#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +00001024
1025#define FlagsALL (FlagsOSZACP | FlagD)
1026#define FlagsEmpty (FlagSet)0
1027
1028#define VG_IS_FLAG_SUBSET(set1,set2) \
1029 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
1030
1031#define VG_UNION_FLAG_SETS(set1,set2) \
1032 ( ((FlagSet)set1) | ((FlagSet)set2) )
1033
1034
1035
1036/* A Micro (u)-instruction. */
1037typedef
1038 struct {
1039 /* word 1 */
1040 UInt lit32; /* 32-bit literal */
1041
1042 /* word 2 */
1043 UShort val1; /* first operand */
1044 UShort val2; /* second operand */
1045
1046 /* word 3 */
1047 UShort val3; /* third operand */
1048 UChar opcode; /* opcode */
1049 UChar size; /* data transfer size */
1050
1051 /* word 4 */
1052 FlagSet flags_r; /* :: FlagSet */
1053 FlagSet flags_w; /* :: FlagSet */
1054 UChar tag1:4; /* first operand tag */
1055 UChar tag2:4; /* second operand tag */
1056 UChar tag3:4; /* third operand tag */
1057 UChar extra4b:4; /* Spare field, used by WIDEN for src
1058 -size, and by LEA2 for scale
njn4f9c9342002-04-29 16:03:24 +00001059 (1,2,4 or 8), and by unconditional JMPs for
1060 orig x86 instr size if --cachesim=yes */
1061
sewardjde4a1d02002-03-22 01:27:54 +00001062
1063 /* word 5 */
1064 UChar cond; /* condition, for jumps */
1065 Bool smc_check:1; /* do a smc test, if writes memory. */
1066 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +00001067 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +00001068 }
1069 UInstr;
1070
1071
1072/* Expandable arrays of uinstrs. */
1073typedef
1074 struct {
1075 Int used;
1076 Int size;
1077 UInstr* instrs;
1078 Int nextTemp;
1079 }
1080 UCodeBlock;
1081
1082/* Refer to `the last instruction stuffed in', including as an
1083 lvalue. */
1084#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1085
1086/* An invalid temporary number :-) */
1087#define INVALID_TEMPREG 999999999
1088
1089
1090/* ---------------------------------------------------------------------
1091 Exports of vg_demangle.c
1092 ------------------------------------------------------------------ */
1093
1094extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
1095
1096
1097/* ---------------------------------------------------------------------
1098 Exports of vg_from_ucode.c
1099 ------------------------------------------------------------------ */
1100
1101extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
1102
1103
1104/* ---------------------------------------------------------------------
1105 Exports of vg_to_ucode.c
1106 ------------------------------------------------------------------ */
1107
1108extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
1109extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
1110extern Char VG_(nameOfIntSize) ( Int size );
1111extern UInt VG_(extend_s_8to32) ( UInt x );
1112extern Int VG_(getNewTemp) ( UCodeBlock* cb );
1113extern Int VG_(getNewShadow) ( UCodeBlock* cb );
1114
1115#define SHADOW(tempreg) ((tempreg)+1)
1116
1117
1118/* ---------------------------------------------------------------------
1119 Exports of vg_translate.c
1120 ------------------------------------------------------------------ */
1121
sewardj1e8cdc92002-04-18 11:37:52 +00001122extern void VG_(translate) ( ThreadState* tst,
1123 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001124 UInt* orig_size,
1125 Addr* trans_addr,
1126 UInt* trans_size );
1127
1128extern void VG_(emptyUInstr) ( UInstr* u );
1129extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1130extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
1131 Tag tag1, UInt val1 );
1132extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
1133 Tag tag1, UInt val1,
1134 Tag tag2, UInt val2 );
1135extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
1136 Tag tag1, UInt val1,
1137 Tag tag2, UInt val2,
1138 Tag tag3, UInt val3 );
1139extern void VG_(setFlagRW) ( UInstr* u,
1140 FlagSet fr, FlagSet fw );
1141
1142extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1143extern Bool VG_(anyFlagUse) ( UInstr* u );
1144
1145
1146
1147extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1148extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1149
njn4f9c9342002-04-29 16:03:24 +00001150extern UCodeBlock* VG_(allocCodeBlock) ( void );
1151extern void VG_(freeCodeBlock) ( UCodeBlock* cb );
1152extern void VG_(copyUInstr) ( UCodeBlock* cb, UInstr* instr );
1153
sewardjde4a1d02002-03-22 01:27:54 +00001154extern Char* VG_(nameCondcode) ( Condcode cond );
1155extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1156extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1157extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1158extern Int VG_(rankToRealRegNo) ( Int rank );
1159
1160extern void* VG_(jitmalloc) ( Int nbytes );
1161extern void VG_(jitfree) ( void* ptr );
1162
1163
1164/* ---------------------------------------------------------------------
1165 Exports of vg_execontext.c.
1166 ------------------------------------------------------------------ */
1167
1168/* Records the PC and a bit of the call chain. The first 4 %eip
1169 values are used in comparisons do remove duplicate errors, and for
1170 comparing against suppression specifications. The rest are purely
1171 informational (but often important). */
1172
1173typedef
1174 struct _ExeContextRec {
1175 struct _ExeContextRec * next;
1176 /* The size of this array is VG_(clo_backtrace_size); at least
1177 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1178 [1] is its caller, [2] is the caller of [1], etc. */
1179 Addr eips[0];
1180 }
1181 ExeContext;
1182
1183
1184/* Initialise the ExeContext storage mechanism. */
1185extern void VG_(init_ExeContext_storage) ( void );
1186
1187/* Print stats (informational only). */
1188extern void VG_(show_ExeContext_stats) ( void );
1189
1190
1191/* Take a snapshot of the client's stack. Search our collection of
1192 ExeContexts to see if we already have it, and if not, allocate a
1193 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001194extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1195 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001196
1197/* Print an ExeContext. */
1198extern void VG_(pp_ExeContext) ( ExeContext* );
1199
1200/* Compare two ExeContexts, just comparing the top two callers. */
1201extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1202
1203/* Compare two ExeContexts, just comparing the top four callers. */
1204extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1205
1206/* Compare two ExeContexts, comparing all callers. */
1207extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1208
1209
1210
1211/* ---------------------------------------------------------------------
1212 Exports of vg_errcontext.c.
1213 ------------------------------------------------------------------ */
1214
1215extern void VG_(load_suppressions) ( void );
1216extern void VG_(show_all_errors) ( void );
1217extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001218extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1219extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001220extern void VG_(record_address_error) ( Addr a, Int size,
1221 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001222
1223extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001224
1225extern void VG_(record_param_err) ( ThreadState* tst,
1226 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001227 Bool isWriteLack,
1228 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001229extern void VG_(record_user_err) ( ThreadState* tst,
1230 Addr a, Bool isWriteLack );
sewardjde4a1d02002-03-22 01:27:54 +00001231
1232
1233/* The classification of a faulting address. */
1234typedef
sewardjb581a132002-05-08 00:32:50 +00001235 enum { Undescribed, /* as-yet unclassified */
1236 Stack,
1237 Unknown, /* classification yielded nothing useful */
1238 Freed, Mallocd,
1239 UserG, UserS }
sewardjde4a1d02002-03-22 01:27:54 +00001240 AddrKind;
1241
1242/* Records info about a faulting address. */
1243typedef
1244 struct {
1245 /* ALL */
1246 AddrKind akind;
1247 /* Freed, Mallocd */
1248 Int blksize;
1249 /* Freed, Mallocd */
1250 Int rwoffset;
1251 /* Freed, Mallocd */
1252 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001253 /* Stack */
1254 ThreadId stack_tid;
sewardjb581a132002-05-08 00:32:50 +00001255 /* True if is just-below %esp -- could be a gcc bug. */
1256 Bool maybe_gcc;
sewardjde4a1d02002-03-22 01:27:54 +00001257 }
1258 AddrInfo;
1259
1260
1261/* ---------------------------------------------------------------------
1262 Exports of vg_clientperms.c
1263 ------------------------------------------------------------------ */
1264
1265extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1266
sewardj8c824512002-04-14 04:16:48 +00001267extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001268
1269extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1270
1271extern void VG_(show_client_block_stats) ( void );
1272
1273
1274/* ---------------------------------------------------------------------
1275 Exports of vg_procselfmaps.c
1276 ------------------------------------------------------------------ */
1277
1278extern
1279void VG_(read_procselfmaps) (
1280 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1281);
1282
1283
1284/* ---------------------------------------------------------------------
1285 Exports of vg_symtab2.c
1286 ------------------------------------------------------------------ */
1287
1288/* We assume the executable is loaded here ... can't really find
1289 out. There is a hacky sanity check in vg_init_memory_audit()
1290 which should trip up most stupidities.
1291*/
1292#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1293
1294extern void VG_(read_symbols) ( void );
1295extern void VG_(mini_stack_dump) ( ExeContext* ec );
1296extern void VG_(what_obj_and_fun_is_this)
1297 ( Addr a,
1298 Char* obj_buf, Int n_obj_buf,
1299 Char* fun_buf, Int n_fun_buf );
njn4f9c9342002-04-29 16:03:24 +00001300extern Bool VG_(what_line_is_this) ( Addr a,
1301 UChar* filename, Int n_filename,
1302 UInt* lineno );
1303extern Bool VG_(what_fn_is_this) ( Bool no_demangle, Addr a,
1304 Char* fn_name, Int n_fn_name);
sewardjde4a1d02002-03-22 01:27:54 +00001305
sewardj18d75132002-05-16 11:06:21 +00001306extern Bool VG_(symtab_notify_munmap) ( Addr start, UInt length );
sewardjde4a1d02002-03-22 01:27:54 +00001307
1308
1309/* ---------------------------------------------------------------------
1310 Exports of vg_clientmalloc.c
1311 ------------------------------------------------------------------ */
1312
sewardjde4a1d02002-03-22 01:27:54 +00001313typedef
1314 enum {
1315 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001316 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001317 Vg_AllocNewVec = 2
1318 }
1319 VgAllocKind;
1320
1321/* Description of a malloc'd chunk. */
1322typedef
1323 struct _ShadowChunk {
1324 struct _ShadowChunk* next;
1325 ExeContext* where; /* where malloc'd/free'd */
1326 UInt size : 30; /* size requested. */
1327 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1328 Addr data; /* ptr to actual block. */
1329 }
1330 ShadowChunk;
1331
1332extern void VG_(clientmalloc_done) ( void );
1333extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1334extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1335
sewardj2e93c502002-04-12 11:12:52 +00001336/* These are called from the scheduler, when it intercepts a user
1337 request. */
sewardj8c824512002-04-14 04:16:48 +00001338extern void* VG_(client_malloc) ( ThreadState* tst,
1339 UInt size, VgAllocKind kind );
1340extern void* VG_(client_memalign) ( ThreadState* tst,
1341 UInt align, UInt size );
1342extern void VG_(client_free) ( ThreadState* tst,
1343 void* ptrV, VgAllocKind kind );
1344extern void* VG_(client_calloc) ( ThreadState* tst,
1345 UInt nmemb, UInt size1 );
1346extern void* VG_(client_realloc) ( ThreadState* tst,
1347 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001348
1349
1350/* ---------------------------------------------------------------------
1351 Exports of vg_main.c
1352 ------------------------------------------------------------------ */
1353
sewardjde4a1d02002-03-22 01:27:54 +00001354/* A structure used as an intermediary when passing the simulated
1355 CPU's state to some assembly fragments, particularly system calls.
1356 Stuff is copied from baseBlock to here, the assembly magic runs,
1357 and then the inverse copy is done. */
1358
1359extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1360 + 1 /* %eflags */
1361 + 1 /* %eip */
1362 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1363 ];
1364
1365/* Handy fns for doing the copy back and forth. */
1366extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1367extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1368
sewardjde4a1d02002-03-22 01:27:54 +00001369/* Called when some unhandleable client behaviour is detected.
1370 Prints a msg and aborts. */
1371extern void VG_(unimplemented) ( Char* msg );
sewardjcfc39b22002-05-08 01:58:18 +00001372extern void VG_(nvidia_moan) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001373
1374/* The stack on which Valgrind runs. We can't use the same stack as the
1375 simulatee -- that's an important design decision. */
1376extern UInt VG_(stack)[10000];
1377
1378/* Similarly, we have to ask for signals to be delivered on an
1379 alternative stack, since it is possible, although unlikely, that
1380 we'll have to run client code from inside the Valgrind-installed
1381 signal handler. If this happens it will be done by
1382 vg_deliver_signal_immediately(). */
1383extern UInt VG_(sigstack)[10000];
1384
sewardjde4a1d02002-03-22 01:27:54 +00001385/* Holds client's %esp at the point we gained control. From this the
1386 client's argc, argv and envp are deduced. */
1387extern Addr VG_(esp_at_startup);
1388extern Int VG_(client_argc);
1389extern Char** VG_(client_argv);
1390extern Char** VG_(client_envp);
1391
1392/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
sewardj3e1eb1f2002-05-18 13:14:17 +00001393 don't get traced into. Also mess up $libdir/valgrind so that our
1394 libpthread.so disappears from view. */
1395void VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) ( Char* ld_preload_str,
1396 Char* ld_library_path_str );
sewardjde4a1d02002-03-22 01:27:54 +00001397
1398/* Something of a function looking for a home ... start up GDB. This
1399 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1400 *client's* stack. This is necessary to give GDB the illusion that
1401 the client program really was running on the real cpu. */
1402extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1403
1404/* Spew out vast amounts of junk during JITting? */
1405extern Bool VG_(disassemble);
1406
1407/* 64-bit counter for the number of basic blocks done. */
1408extern ULong VG_(bbs_done);
1409/* 64-bit counter for the number of bbs to go before a debug exit. */
1410extern ULong VG_(bbs_to_go);
1411
1412/* Counts downwards in vg_run_innerloop. */
1413extern UInt VG_(dispatch_ctr);
1414
sewardjde4a1d02002-03-22 01:27:54 +00001415/* Is the client running on the simulated CPU or the real one? */
1416extern Bool VG_(running_on_simd_CPU); /* Initially False */
1417
1418/* The current LRU epoch. */
1419extern UInt VG_(current_epoch);
1420
sewardj7e87e382002-05-03 19:09:05 +00001421/* This is the ThreadId of the last thread the scheduler ran. */
1422extern ThreadId VG_(last_run_tid);
1423
sewardjde4a1d02002-03-22 01:27:54 +00001424
1425/* --- Counters, for informational purposes only. --- */
1426
1427/* Number of lookups which miss the fast tt helper. */
1428extern UInt VG_(tt_fast_misses);
1429
1430/* Counts for LRU informational messages. */
1431
1432/* Number and total o/t size of new translations this epoch. */
1433extern UInt VG_(this_epoch_in_count);
1434extern UInt VG_(this_epoch_in_osize);
1435extern UInt VG_(this_epoch_in_tsize);
1436/* Number and total o/t size of discarded translations this epoch. */
1437extern UInt VG_(this_epoch_out_count);
1438extern UInt VG_(this_epoch_out_osize);
1439extern UInt VG_(this_epoch_out_tsize);
1440/* Number and total o/t size of translations overall. */
1441extern UInt VG_(overall_in_count);
1442extern UInt VG_(overall_in_osize);
1443extern UInt VG_(overall_in_tsize);
1444/* Number and total o/t size of discards overall. */
1445extern UInt VG_(overall_out_count);
1446extern UInt VG_(overall_out_osize);
1447extern UInt VG_(overall_out_tsize);
1448
1449/* The number of LRU-clearings of TT/TC. */
1450extern UInt VG_(number_of_lrus);
1451
1452/* Counts pertaining to the register allocator. */
1453
1454/* total number of uinstrs input to reg-alloc */
1455extern UInt VG_(uinstrs_prealloc);
1456
1457/* total number of uinstrs added due to spill code */
1458extern UInt VG_(uinstrs_spill);
1459
1460/* number of bbs requiring spill code */
1461extern UInt VG_(translations_needing_spill);
1462
1463/* total of register ranks over all translations */
1464extern UInt VG_(total_reg_rank);
1465
sewardjde4a1d02002-03-22 01:27:54 +00001466/* Counts pertaining to internal sanity checking. */
1467extern UInt VG_(sanity_fast_count);
1468extern UInt VG_(sanity_slow_count);
1469
sewardj2e93c502002-04-12 11:12:52 +00001470/* Counts pertaining to the scheduler. */
1471extern UInt VG_(num_scheduling_events_MINOR);
1472extern UInt VG_(num_scheduling_events_MAJOR);
1473
sewardjde4a1d02002-03-22 01:27:54 +00001474
1475/* ---------------------------------------------------------------------
1476 Exports of vg_memory.c
1477 ------------------------------------------------------------------ */
1478
1479extern void VGM_(init_memory_audit) ( void );
1480extern Addr VGM_(curr_dataseg_end);
1481extern void VG_(show_reg_tags) ( void );
1482extern void VG_(detect_memory_leaks) ( void );
1483extern void VG_(done_prof_mem) ( void );
1484
1485/* Set permissions for an address range. Not speed-critical. */
1486extern void VGM_(make_noaccess) ( Addr a, UInt len );
1487extern void VGM_(make_writable) ( Addr a, UInt len );
1488extern void VGM_(make_readable) ( Addr a, UInt len );
1489/* Use with care! (read: use for shmat only) */
1490extern void VGM_(make_readwritable) ( Addr a, UInt len );
1491extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1492 UInt len );
1493
1494/* Check permissions for an address range. Not speed-critical. */
1495extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1496extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1497extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1498
sewardj0c3b53f2002-05-01 01:58:35 +00001499/* Sanity checks which may be done at any time. The scheduler decides
1500 when. */
1501extern void VG_(do_sanity_checks) ( Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001502/* Very cheap ... */
1503extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1504
1505/* These functions are called from generated code. */
1506extern void VG_(helperc_STOREV4) ( UInt, Addr );
1507extern void VG_(helperc_STOREV2) ( UInt, Addr );
1508extern void VG_(helperc_STOREV1) ( UInt, Addr );
1509
1510extern UInt VG_(helperc_LOADV1) ( Addr );
1511extern UInt VG_(helperc_LOADV2) ( Addr );
1512extern UInt VG_(helperc_LOADV4) ( Addr );
1513
1514extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1515extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1516extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1517
1518/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1519 space and pass the addresses and values of all addressible,
1520 defined, aligned words to notify_word. This is the basis for the
1521 leak detector. Returns the number of calls made to notify_word. */
1522UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1523
1524/* Is this address within some small distance below %ESP? Used only
1525 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001526extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001527
1528/* Nasty kludgery to deal with applications which switch stacks,
1529 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001530#define VG_PLAUSIBLE_STACK_SIZE 8000000
1531
sewardjc3bd5f52002-05-01 03:24:23 +00001532/* Needed by the pthreads implementation. */
1533#define VGM_WORD_VALID 0
1534#define VGM_WORD_INVALID 0xFFFFFFFF
1535
sewardjde4a1d02002-03-22 01:27:54 +00001536
1537/* ---------------------------------------------------------------------
1538 Exports of vg_syscall_mem.c
1539 ------------------------------------------------------------------ */
1540
sewardj2e93c502002-04-12 11:12:52 +00001541extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001542
sewardj2e93c502002-04-12 11:12:52 +00001543extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1544 Int syscallno,
1545 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001546
1547extern Bool VG_(is_kerror) ( Int res );
1548
sewardj018f7622002-05-15 21:13:39 +00001549#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1550 VG_(load_thread_state)(thread_id); \
1551 VG_(copy_baseBlock_to_m_state_static)(); \
1552 VG_(do_syscall)(); \
1553 VG_(copy_m_state_static_to_baseBlock)(); \
1554 VG_(save_thread_state)(thread_id); \
1555 VG_(threads)[thread_id].sh_eax = VGM_WORD_VALID; \
1556 result_lvalue = VG_(threads)[thread_id].m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001557
1558
1559/* ---------------------------------------------------------------------
1560 Exports of vg_transtab.c
1561 ------------------------------------------------------------------ */
1562
1563/* An entry in the translation table (TT). */
1564typedef
1565 struct {
1566 /* +0 */ Addr orig_addr;
1567 /* +4 */ Addr trans_addr;
1568 /* +8 */ UInt mru_epoch;
1569 /* +12 */ UShort orig_size;
1570 /* +14 */ UShort trans_size;
1571 }
1572 TTEntry;
1573
1574/* The number of basic blocks in an epoch (one age-step). */
1575#define VG_BBS_PER_EPOCH 20000
1576
1577extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1578extern void VG_(maybe_do_lru_pass) ( void );
1579extern void VG_(flush_transtab) ( void );
1580extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1581extern void VG_(add_to_trans_tab) ( TTEntry* tte );
sewardj18d75132002-05-16 11:06:21 +00001582extern void VG_(invalidate_translations) ( Addr start, UInt range );
sewardjde4a1d02002-03-22 01:27:54 +00001583
sewardj18d75132002-05-16 11:06:21 +00001584extern void VG_(init_tt_tc) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001585
1586extern void VG_(sanity_check_tc_tt) ( void );
1587extern Addr VG_(search_transtab) ( Addr original_addr );
1588
1589extern void VG_(invalidate_tt_fast)( void );
1590
1591
1592/* ---------------------------------------------------------------------
1593 Exports of vg_vtagops.c
1594 ------------------------------------------------------------------ */
1595
1596/* Lists the names of value-tag operations used in instrumented
1597 code. These are the third argument to TAG1 and TAG2 uinsns. */
1598
1599typedef
1600 enum {
1601 /* Unary. */
1602 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1603 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1604
1605 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1606
1607 VgT_Left4, VgT_Left2, VgT_Left1,
1608
1609 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1610 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1611
1612 /* Binary; 1st is rd; 2nd is rd+wr */
1613 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1614 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1615
1616 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1617 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1618 VgT_DebugFn
1619 }
1620 VgTagOp;
1621
1622extern Char* VG_(nameOfTagOp) ( VgTagOp );
1623extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1624
1625
1626/* ---------------------------------------------------------------------
1627 Exports of vg_syscall.S
1628 ------------------------------------------------------------------ */
1629
1630extern void VG_(do_syscall) ( void );
1631
1632
1633/* ---------------------------------------------------------------------
1634 Exports of vg_startup.S
1635 ------------------------------------------------------------------ */
1636
sewardjde4a1d02002-03-22 01:27:54 +00001637extern void VG_(switch_to_real_CPU) ( void );
1638
sewardj35805422002-04-21 13:05:34 +00001639extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1640 Addr m_esp_at_error,
1641 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001642
1643
1644/* ---------------------------------------------------------------------
1645 Exports of vg_dispatch.S
1646 ------------------------------------------------------------------ */
1647
sewardj2e93c502002-04-12 11:12:52 +00001648/* Run a thread for a (very short) while, until some event happens
1649 which means we need to defer to the scheduler. */
1650extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001651
1652
1653/* ---------------------------------------------------------------------
1654 Exports of vg_helpers.S
1655 ------------------------------------------------------------------ */
1656
sewardjde4a1d02002-03-22 01:27:54 +00001657/* Mul, div, etc, -- we don't codegen these directly. */
1658extern void VG_(helper_idiv_64_32);
1659extern void VG_(helper_div_64_32);
1660extern void VG_(helper_idiv_32_16);
1661extern void VG_(helper_div_32_16);
1662extern void VG_(helper_idiv_16_8);
1663extern void VG_(helper_div_16_8);
1664
1665extern void VG_(helper_imul_32_64);
1666extern void VG_(helper_mul_32_64);
1667extern void VG_(helper_imul_16_32);
1668extern void VG_(helper_mul_16_32);
1669extern void VG_(helper_imul_8_16);
1670extern void VG_(helper_mul_8_16);
1671
1672extern void VG_(helper_CLD);
1673extern void VG_(helper_STD);
1674extern void VG_(helper_get_dirflag);
1675
1676extern void VG_(helper_shldl);
1677extern void VG_(helper_shldw);
1678extern void VG_(helper_shrdl);
1679extern void VG_(helper_shrdw);
1680
1681extern void VG_(helper_RDTSC);
1682extern void VG_(helper_CPUID);
1683
sewardjde4a1d02002-03-22 01:27:54 +00001684extern void VG_(helper_bsf);
1685extern void VG_(helper_bsr);
1686
1687extern void VG_(helper_fstsw_AX);
1688extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001689extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001690extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001691
1692extern void VG_(helper_value_check4_fail);
1693extern void VG_(helper_value_check2_fail);
1694extern void VG_(helper_value_check1_fail);
1695extern void VG_(helper_value_check0_fail);
1696
sewardjbc5b99f2002-04-13 00:08:51 +00001697/* NOT FUNCTIONS; these are bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001698extern void VG_(signalreturn_bogusRA)( void );
sewardjbc5b99f2002-04-13 00:08:51 +00001699extern void VG_(pthreadreturn_bogusRA)( void );
sewardj54cacf02002-04-12 23:24:59 +00001700
njn4f9c9342002-04-29 16:03:24 +00001701/* ---------------------------------------------------------------------
1702 Exports of vg_cachesim.c
1703 ------------------------------------------------------------------ */
1704
1705extern UCodeBlock* VG_(cachesim_instrument)(UCodeBlock* cb_in, Addr orig_addr);
1706
1707typedef struct _iCC iCC;
1708typedef struct _idCC idCC;
1709
1710extern void VG_(init_cachesim) ( void );
1711extern void VG_(show_cachesim_results)( Int client_argc, Char** client_argv );
1712
1713extern void VG_(cachesim_log_non_mem_instr)( iCC* cc );
1714extern void VG_(cachesim_log_mem_instr) ( idCC* cc, Addr data_addr );
sewardjde4a1d02002-03-22 01:27:54 +00001715
sewardj18d75132002-05-16 11:06:21 +00001716extern void VG_(cachesim_notify_discard) ( TTEntry* tte );
1717
1718
sewardjde4a1d02002-03-22 01:27:54 +00001719/* ---------------------------------------------------------------------
1720 The state of the simulated CPU.
1721 ------------------------------------------------------------------ */
1722
1723/* This is the Intel register encoding. */
1724#define R_EAX 0
1725#define R_ECX 1
1726#define R_EDX 2
1727#define R_EBX 3
1728#define R_ESP 4
1729#define R_EBP 5
1730#define R_ESI 6
1731#define R_EDI 7
1732
1733#define R_AL (0+R_EAX)
1734#define R_CL (0+R_ECX)
1735#define R_DL (0+R_EDX)
1736#define R_BL (0+R_EBX)
1737#define R_AH (4+R_EAX)
1738#define R_CH (4+R_ECX)
1739#define R_DH (4+R_EDX)
1740#define R_BH (4+R_EBX)
1741
1742
1743/* ---------------------------------------------------------------------
1744 Offsets into baseBlock for everything which needs to referred to
1745 from generated code. The order of these decls does not imply
1746 what the order of the actual offsets is. The latter is important
1747 and is set up in vg_main.c.
1748 ------------------------------------------------------------------ */
1749
1750/* An array of words. In generated code, %ebp always points to the
1751 start of this array. Useful stuff, like the simulated CPU state,
1752 and the addresses of helper functions, can then be found by
1753 indexing off %ebp. The following declares variables which, at
1754 startup time, are given values denoting offsets into baseBlock.
1755 These offsets are in *words* from the start of baseBlock. */
1756
1757#define VG_BASEBLOCK_WORDS 200
1758
1759extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1760
1761
1762/* -----------------------------------------------------
1763 Read-write parts of baseBlock.
1764 -------------------------------------------------- */
1765
1766/* State of the simulated CPU. */
1767extern Int VGOFF_(m_eax);
1768extern Int VGOFF_(m_ecx);
1769extern Int VGOFF_(m_edx);
1770extern Int VGOFF_(m_ebx);
1771extern Int VGOFF_(m_esp);
1772extern Int VGOFF_(m_ebp);
1773extern Int VGOFF_(m_esi);
1774extern Int VGOFF_(m_edi);
1775extern Int VGOFF_(m_eflags);
1776extern Int VGOFF_(m_fpustate);
1777extern Int VGOFF_(m_eip);
1778
1779/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1780extern Int VGOFF_(spillslots);
1781
1782/* Records the valid bits for the 8 integer regs & flags reg. */
1783extern Int VGOFF_(sh_eax);
1784extern Int VGOFF_(sh_ecx);
1785extern Int VGOFF_(sh_edx);
1786extern Int VGOFF_(sh_ebx);
1787extern Int VGOFF_(sh_esp);
1788extern Int VGOFF_(sh_ebp);
1789extern Int VGOFF_(sh_esi);
1790extern Int VGOFF_(sh_edi);
1791extern Int VGOFF_(sh_eflags);
1792
1793
1794/* -----------------------------------------------------
1795 Read-only parts of baseBlock.
1796 -------------------------------------------------- */
1797
1798/* Offsets of addresses of helper functions. A "helper" function is
1799 one which is called from generated code. */
1800
1801extern Int VGOFF_(helper_idiv_64_32);
1802extern Int VGOFF_(helper_div_64_32);
1803extern Int VGOFF_(helper_idiv_32_16);
1804extern Int VGOFF_(helper_div_32_16);
1805extern Int VGOFF_(helper_idiv_16_8);
1806extern Int VGOFF_(helper_div_16_8);
1807
1808extern Int VGOFF_(helper_imul_32_64);
1809extern Int VGOFF_(helper_mul_32_64);
1810extern Int VGOFF_(helper_imul_16_32);
1811extern Int VGOFF_(helper_mul_16_32);
1812extern Int VGOFF_(helper_imul_8_16);
1813extern Int VGOFF_(helper_mul_8_16);
1814
1815extern Int VGOFF_(helper_CLD);
1816extern Int VGOFF_(helper_STD);
1817extern Int VGOFF_(helper_get_dirflag);
1818
1819extern Int VGOFF_(helper_shldl);
1820extern Int VGOFF_(helper_shldw);
1821extern Int VGOFF_(helper_shrdl);
1822extern Int VGOFF_(helper_shrdw);
1823
1824extern Int VGOFF_(helper_RDTSC);
1825extern Int VGOFF_(helper_CPUID);
1826
sewardjde4a1d02002-03-22 01:27:54 +00001827extern Int VGOFF_(helper_bsf);
1828extern Int VGOFF_(helper_bsr);
1829
1830extern Int VGOFF_(helper_fstsw_AX);
1831extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001832extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001833extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001834
1835extern Int VGOFF_(helper_value_check4_fail);
1836extern Int VGOFF_(helper_value_check2_fail);
1837extern Int VGOFF_(helper_value_check1_fail);
1838extern Int VGOFF_(helper_value_check0_fail);
1839
sewardjde4a1d02002-03-22 01:27:54 +00001840extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1841extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1842extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1843
1844extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1845extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1846extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1847
1848extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1849extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1850extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1851
njn4f9c9342002-04-29 16:03:24 +00001852extern Int VGOFF_(cachesim_log_non_mem_instr);
1853extern Int VGOFF_(cachesim_log_mem_instr);
sewardjde4a1d02002-03-22 01:27:54 +00001854
1855#endif /* ndef __VG_INCLUDE_H */
1856
sewardj3b2736a2002-03-24 12:18:35 +00001857
1858/* ---------------------------------------------------------------------
1859 Finally - autoconf-generated settings
1860 ------------------------------------------------------------------ */
1861
1862#include "config.h"
1863
sewardjde4a1d02002-03-22 01:27:54 +00001864/*--------------------------------------------------------------------*/
1865/*--- end vg_include.h ---*/
1866/*--------------------------------------------------------------------*/