blob: 4b36e443dabf971a36b410f157381b35c9822491 [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. */
sewardjd8091eb2002-04-24 02:19:36 +0000109#define VG_GCC296_BUG_STACK_SLOP 256
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);
265
266
267/* ---------------------------------------------------------------------
268 Debugging and profiling stuff
269 ------------------------------------------------------------------ */
270
271/* No, really. I _am_ that strange. */
272#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
273
274/* Tools for building messages from multiple parts. */
275typedef
276 enum { Vg_UserMsg, Vg_DebugMsg, Vg_DebugExtraMsg }
277 VgMsgKind;
278
279extern void VG_(start_msg) ( VgMsgKind kind );
280extern void VG_(add_to_msg) ( Char* format, ... );
281extern void VG_(end_msg) ( void );
282
283/* Send a simple, single-part message. */
284extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
285
286/* Create a logfile into which messages can be dumped. */
287extern void VG_(startup_logging) ( void );
288extern void VG_(shutdown_logging) ( void );
289
290
291/* Profiling stuff */
292#ifdef VG_PROFILE
293
294#define VGP_M_STACK 10
295
njn4f9c9342002-04-29 16:03:24 +0000296#define VGP_M_CCS 24 /* == the # of elems in VGP_LIST */
sewardjde4a1d02002-03-22 01:27:54 +0000297#define VGP_LIST \
298 VGP_PAIR(VgpRun=0, "running"), \
299 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
300 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
301 VGP_PAIR(VgpTranslate, "translate-main"), \
302 VGP_PAIR(VgpToUCode, "to-ucode"), \
303 VGP_PAIR(VgpFromUcode, "from-ucode"), \
304 VGP_PAIR(VgpImprove, "improve"), \
305 VGP_PAIR(VgpInstrument, "instrument"), \
306 VGP_PAIR(VgpCleanup, "cleanup"), \
307 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
308 VGP_PAIR(VgpDoLRU, "do-lru"), \
309 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
310 VGP_PAIR(VgpInitAudit, "init-mem-audit"), \
311 VGP_PAIR(VgpExeContext, "exe-context"), \
312 VGP_PAIR(VgpReadSyms, "read-syms"), \
313 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
314 VGP_PAIR(VgpSARP, "set-addr-range-perms"), \
315 VGP_PAIR(VgpSyscall, "syscall wrapper"), \
njn4f9c9342002-04-29 16:03:24 +0000316 VGP_PAIR(VgpCacheInstrument, "cache instrument"), \
317 VGP_PAIR(VgpCacheGetBBCC,"cache get BBCC"), \
318 VGP_PAIR(VgpCacheSimulate, "cache simulate"), \
319 VGP_PAIR(VgpCacheDump, "cache stats dump"), \
sewardjde4a1d02002-03-22 01:27:54 +0000320 VGP_PAIR(VgpSpare1, "spare 1"), \
321 VGP_PAIR(VgpSpare2, "spare 2")
322
323#define VGP_PAIR(enumname,str) enumname
324typedef enum { VGP_LIST } VgpCC;
325#undef VGP_PAIR
326
327extern void VGP_(init_profiling) ( void );
328extern void VGP_(done_profiling) ( void );
329extern void VGP_(pushcc) ( VgpCC );
330extern void VGP_(popcc) ( void );
331
332#define VGP_PUSHCC(cc) VGP_(pushcc)(cc)
333#define VGP_POPCC VGP_(popcc)()
334
335#else
336
337#define VGP_PUSHCC(cc) /* */
338#define VGP_POPCC /* */
339
340#endif /* VG_PROFILE */
341
342
343/* ---------------------------------------------------------------------
344 Exports of vg_malloc2.c
345 ------------------------------------------------------------------ */
346
347/* Allocation arenas.
348 SYMTAB is for Valgrind's symbol table storage.
349 CLIENT is for the client's mallocs/frees.
350 DEMANGLE is for the C++ demangler.
351 EXECTXT is for storing ExeContexts.
352 ERRCTXT is for storing ErrContexts.
353 PRIVATE is for Valgrind general stuff.
354 TRANSIENT is for very short-term use. It should be empty
355 in between uses.
356 When adding a new arena, remember also to add it
357 to ensure_mm_init().
358*/
359typedef Int ArenaId;
360
361#define VG_N_ARENAS 7
362
363#define VG_AR_PRIVATE 0 /* :: ArenaId */
364#define VG_AR_SYMTAB 1 /* :: ArenaId */
365#define VG_AR_CLIENT 2 /* :: ArenaId */
366#define VG_AR_DEMANGLE 3 /* :: ArenaId */
367#define VG_AR_EXECTXT 4 /* :: ArenaId */
368#define VG_AR_ERRCTXT 5 /* :: ArenaId */
369#define VG_AR_TRANSIENT 6 /* :: ArenaId */
370
371extern void* VG_(malloc) ( ArenaId arena, Int nbytes );
372extern void VG_(free) ( ArenaId arena, void* ptr );
373extern void* VG_(calloc) ( ArenaId arena, Int nmemb, Int nbytes );
374extern void* VG_(realloc) ( ArenaId arena, void* ptr, Int size );
375extern void* VG_(malloc_aligned) ( ArenaId aid, Int req_alignB,
376 Int req_pszB );
377
378extern void VG_(mallocSanityCheckArena) ( ArenaId arena );
379extern void VG_(mallocSanityCheckAll) ( void );
380
381extern void VG_(show_all_arena_stats) ( void );
382extern Bool VG_(is_empty_arena) ( ArenaId aid );
383
384
385/* The red-zone size for the client. This can be arbitrary, but
386 unfortunately must be set at compile time. */
387#define VG_AR_CLIENT_REDZONE_SZW 4
388
389#define VG_AR_CLIENT_REDZONE_SZB \
390 (VG_AR_CLIENT_REDZONE_SZW * VKI_BYTES_PER_WORD)
391
392
393/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000394 Exports of vg_clientfuns.c
395 ------------------------------------------------------------------ */
396
397/* This doesn't export code or data that valgrind.so needs to link
398 against. However, the scheduler does need to know the following
399 request codes. A few, publically-visible, request codes are also
400 defined in valgrind.h. */
401
402#define VG_USERREQ__MALLOC 0x2001
403#define VG_USERREQ__BUILTIN_NEW 0x2002
404#define VG_USERREQ__BUILTIN_VEC_NEW 0x2003
405
406#define VG_USERREQ__FREE 0x2004
407#define VG_USERREQ__BUILTIN_DELETE 0x2005
408#define VG_USERREQ__BUILTIN_VEC_DELETE 0x2006
409
410#define VG_USERREQ__CALLOC 0x2007
411#define VG_USERREQ__REALLOC 0x2008
412#define VG_USERREQ__MEMALIGN 0x2009
413
414
415#define VG_USERREQ__PTHREAD_CREATE 0x3001
sewardjbc5b99f2002-04-13 00:08:51 +0000416#define VG_USERREQ__PTHREAD_JOIN 0x3002
417#define VG_USERREQ__PTHREAD_GET_THREADID 0x3003
sewardj3b5d8862002-04-20 13:53:23 +0000418#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x3004
sewardj30671ff2002-04-21 00:13:57 +0000419#define VG_USERREQ__PTHREAD_MUTEX_TRYLOCK 0x3005
420#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x3006
421#define VG_USERREQ__PTHREAD_CANCEL 0x3007
422#define VG_USERREQ__PTHREAD_EXIT 0x3008
423#define VG_USERREQ__PTHREAD_COND_WAIT 0x3009
sewardj5f07b662002-04-23 16:52:51 +0000424#define VG_USERREQ__PTHREAD_COND_TIMEDWAIT 0x300A
425#define VG_USERREQ__PTHREAD_COND_SIGNAL 0x300B
426#define VG_USERREQ__PTHREAD_COND_BROADCAST 0x300C
427#define VG_USERREQ__PTHREAD_KEY_CREATE 0x300D
428#define VG_USERREQ__PTHREAD_KEY_DELETE 0x300E
429#define VG_USERREQ__PTHREAD_SETSPECIFIC 0x300F
430#define VG_USERREQ__PTHREAD_GETSPECIFIC 0x3010
sewardj56fc53d2002-04-24 01:17:42 +0000431#define VG_USERREQ__READ_MILLISECOND_TIMER 0x3011
sewardj2e93c502002-04-12 11:12:52 +0000432
sewardj45b4b372002-04-16 22:50:32 +0000433/* Cosmetic ... */
434#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
435
sewardj54cacf02002-04-12 23:24:59 +0000436/*
437In vg_constants.h:
438#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardjbc5b99f2002-04-13 00:08:51 +0000439#define VG_USERREQ__PTHREAD_RETURNS 0x4002
sewardj54cacf02002-04-12 23:24:59 +0000440*/
441
442
sewardj2e93c502002-04-12 11:12:52 +0000443/* ---------------------------------------------------------------------
444 Constants pertaining to the simulated CPU state, VG_(baseBlock),
445 which need to go here to avoid ugly circularities.
446 ------------------------------------------------------------------ */
447
448/* How big is the saved FPU state? */
449#define VG_SIZE_OF_FPUSTATE 108
450/* ... and in words ... */
451#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
452
453
454/* ---------------------------------------------------------------------
455 Exports of vg_scheduler.c
456 ------------------------------------------------------------------ */
457
458/* ThreadIds are simply indices into the vg_threads[] array. */
459typedef
460 UInt
461 ThreadId;
462
sewardj6072c362002-04-19 14:40:57 +0000463/* Special magic value for an invalid ThreadId. It corresponds to
464 LinuxThreads using zero as the initial value for
465 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
466#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000467
468typedef
469 enum {
470 VgTs_Empty, /* this slot is not in use */
471 VgTs_Runnable, /* waiting to be scheduled */
472 VgTs_WaitJoiner, /* waiting for someone to do join on me */
473 VgTs_WaitJoinee, /* waiting for the thread I did join on */
474 VgTs_WaitFD, /* waiting for I/O completion on a fd */
475 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000476 VgTs_WaitCV, /* waiting on a condition variable */
sewardj2e93c502002-04-12 11:12:52 +0000477 VgTs_Sleeping /* sleeping for a while */
478 }
479 ThreadStatus;
480
481typedef
482 struct {
sewardj6072c362002-04-19 14:40:57 +0000483 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
484 The thread identity is simply the index in vg_threads[].
485 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000486 that we don't try and allocate or deallocate its stack. For
487 convenience of generating error message, we also put the
488 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000489 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000490 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000491
sewardj5f07b662002-04-23 16:52:51 +0000492 /* Current scheduling status.
493
494 Complications: whenever this is set to VgTs_WaitMX, you
495 should also set .m_edx to whatever the required return value
496 is for pthread_mutex_lock / pthread_cond_timedwait for when
497 the mutex finally gets unblocked. */
sewardj2e93c502002-04-12 11:12:52 +0000498 ThreadStatus status;
499
500 /* Identity of joiner (thread who called join on me), or
501 VG_INVALID_THREADID if no one asked to join yet. */
502 ThreadId joiner;
503
sewardj3b5d8862002-04-20 13:53:23 +0000504 /* When .status == WaitMX, points to the mutex I am waiting for.
505 When .status == WaitCV, points to the mutex associated with
506 the condition variable indicated by the .associated_cv field.
507 In all other cases, should be NULL. */
508 void* /* pthread_mutex_t* */ associated_mx;
509
510 /* When .status == WaitCV, points to the condition variable I am
511 waiting for. In all other cases, should be NULL. */
512 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000513
sewardj5f07b662002-04-23 16:52:51 +0000514 /* If VgTs_Sleeping, this is when we should wake up, measured in
515 milliseconds as supplied by VG_(read_millisecond_counter).
516
517 If VgTs_WaitCV, this indicates the time at which
518 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
519 this means infinitely far in the future, viz,
520 pthread_cond_wait. */
521 UInt awaken_at;
sewardj2e93c502002-04-12 11:12:52 +0000522
523 /* return value */
524 void* retval;
525
sewardj5f07b662002-04-23 16:52:51 +0000526 /* thread-specific data */
527 void* specifics[VG_N_THREAD_KEYS];
528
sewardj2e93c502002-04-12 11:12:52 +0000529 /* Stacks. When a thread slot is freed, we don't deallocate its
530 stack; we just leave it lying around for the next use of the
531 slot. If the next use of the slot requires a larger stack,
532 only then is the old one deallocated and a new one
533 allocated.
534
535 For the main thread (threadid == 0), this mechanism doesn't
536 apply. We don't know the size of the stack since we didn't
537 allocate it, and furthermore we never reallocate it. */
538
539 /* The allocated size of this thread's stack (permanently zero
540 if this is ThreadId == 0, since we didn't allocate its stack) */
541 UInt stack_size;
542
543 /* Address of the lowest word in this thread's stack. NULL means
544 not allocated yet.
545 */
546 Addr stack_base;
547
sewardj1e8cdc92002-04-18 11:37:52 +0000548 /* Address of the highest legitimate word in this stack. This is
549 used for error messages only -- not critical for execution
550 correctness. Is is set for all stacks, specifically including
551 ThreadId == 0 (the main thread). */
552 Addr stack_highest_word;
553
sewardj2e93c502002-04-12 11:12:52 +0000554 /* Saved machine context. */
555 UInt m_eax;
556 UInt m_ebx;
557 UInt m_ecx;
558 UInt m_edx;
559 UInt m_esi;
560 UInt m_edi;
561 UInt m_ebp;
562 UInt m_esp;
563 UInt m_eflags;
564 UInt m_eip;
565 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
566
567 UInt sh_eax;
568 UInt sh_ebx;
569 UInt sh_ecx;
570 UInt sh_edx;
571 UInt sh_esi;
572 UInt sh_edi;
573 UInt sh_ebp;
574 UInt sh_esp;
575 UInt sh_eflags;
576 }
577 ThreadState;
578
579
580/* Copy the specified thread's state into VG_(baseBlock) in
581 preparation for running it. */
582extern void VG_(load_thread_state)( ThreadId );
583
584/* Save the specified thread's state back in VG_(baseBlock), and fill
585 VG_(baseBlock) with junk, for sanity-check reasons. */
586extern void VG_(save_thread_state)( ThreadId );
587
588/* Get the thread state block for the specified thread. */
589extern ThreadState* VG_(get_thread_state)( ThreadId );
590
sewardj1e8cdc92002-04-18 11:37:52 +0000591/* And for the currently running one, if valid. */
592extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000593
sewardj1e8cdc92002-04-18 11:37:52 +0000594/* Similarly ... */
595extern ThreadId VG_(get_current_tid) ( void );
596
597/* Which thread is this address in the stack of, if any? Used for
598 error message generation. */
599extern ThreadId VG_(identify_stack_addr)( Addr a );
600
sewardj2e93c502002-04-12 11:12:52 +0000601
602/* Return codes from the scheduler. */
603typedef
sewardj7e87e382002-05-03 19:09:05 +0000604 enum {
605 VgSrc_Deadlock, /* no runnable threads and no prospect of any
606 even if we wait for a long time */
607 VgSrc_ExitSyscall, /* client called exit(). This is the normal
608 route out. */
609 VgSrc_BbsDone /* In a debugging run, the specified number of
610 bbs has been completed. */
611 }
sewardj2e93c502002-04-12 11:12:52 +0000612 VgSchedReturnCode;
613
sewardj7e87e382002-05-03 19:09:05 +0000614
sewardj2e93c502002-04-12 11:12:52 +0000615/* The scheduler. */
616extern VgSchedReturnCode VG_(scheduler) ( void );
617
618extern void VG_(scheduler_init) ( void );
619
sewardj15a43e12002-04-17 19:35:12 +0000620extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000621
622/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
623extern jmp_buf VG_(scheduler_jmpbuf);
624/* ... and if so, here's the signal which caused it to do so. */
625extern Int VG_(longjmpd_on_signal);
626
627
628/* We check that the initial stack, which we can't move, is allocated
629 here. VG_(scheduler_init) checks this.
630*/
sewardjebc82332002-04-24 14:44:23 +0000631#define VG_STARTUP_STACK_MASK (Addr)0xBFF80000
sewardj2e93c502002-04-12 11:12:52 +0000632
633
634/* The red-zone size which we put at the bottom (highest address) of
635 thread stacks, for paranoia reasons. This can be arbitrary, and
636 doesn't really need to be set at compile time. */
637#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
638
639#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
640 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
641
642
643
644/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000645 Exports of vg_signals.c
646 ------------------------------------------------------------------ */
647
sewardjde4a1d02002-03-22 01:27:54 +0000648extern void VG_(sigstartup_actions) ( void );
649
sewardj14e03422002-04-24 19:51:31 +0000650extern Bool VG_(deliver_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000651extern void VG_(unblock_host_signal) ( Int sigNo );
652
653
654/* Fake system calls for signal handling. */
sewardj2e93c502002-04-12 11:12:52 +0000655extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000656extern void VG_(do__NR_sigprocmask) ( Int how, vki_ksigset_t* set );
657
sewardj2e93c502002-04-12 11:12:52 +0000658/* Modify the current thread's state once we have detected it is
659 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000660extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000661
sewardj2e93c502002-04-12 11:12:52 +0000662/* Handy utilities to block/restore all host signals. */
663extern void VG_(block_all_host_signals)
664 ( /* OUT */ vki_ksigset_t* saved_mask );
665extern void VG_(restore_host_signals)
666 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000667
668/* ---------------------------------------------------------------------
669 Exports of vg_mylibc.c
670 ------------------------------------------------------------------ */
671
672
673#define NULL ((void*)0)
674
675extern void VG_(exit)( Int status )
676 __attribute__ ((__noreturn__));
677
678extern void VG_(printf) ( const char *format, ... );
679/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
680
681extern void VG_(sprintf) ( Char* buf, Char *format, ... );
682
683extern void VG_(vprintf) ( void(*send)(Char),
684 const Char *format, va_list vargs );
685
686extern Bool VG_(isspace) ( Char c );
687
688extern Int VG_(strlen) ( const Char* str );
689
690extern Long VG_(atoll) ( Char* str );
691
692extern Char* VG_(strcat) ( Char* dest, const Char* src );
693extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
694extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
695
696extern Char* VG_(strcpy) ( Char* dest, const Char* src );
697
698extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
699extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
700
701extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
702extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
703
704extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
705extern Char* VG_(strchr) ( const Char* s, Char c );
706extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
707
708extern Char* VG_(getenv) ( Char* name );
709extern Int VG_(getpid) ( void );
sewardj5f07b662002-04-23 16:52:51 +0000710
711extern void VG_(start_rdtsc_calibration) ( void );
712extern void VG_(end_rdtsc_calibration) ( void );
713extern UInt VG_(read_millisecond_timer) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000714
715
716extern Char VG_(toupper) ( Char c );
717
718extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
719
720extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
721
722extern Bool VG_(stringMatch) ( Char* pat, Char* str );
723
724
725#define __STRING(x) #x
726
727/* Asserts are permanently enabled. Hurrah! */
728#define vg_assert(expr) \
729 ((void) ((expr) ? 0 : \
730 (VG_(assert_fail) (__STRING(expr), \
731 __FILE__, __LINE__, \
732 __PRETTY_FUNCTION__), 0)))
733
734extern void VG_(assert_fail) ( Char* expr, Char* file,
735 Int line, Char* fn )
736 __attribute__ ((__noreturn__));
737
njn4f9c9342002-04-29 16:03:24 +0000738/* Reading and writing files. */
sewardjde4a1d02002-03-22 01:27:54 +0000739extern Int VG_(open_read) ( Char* pathname );
njn4f9c9342002-04-29 16:03:24 +0000740extern Int VG_(open_write) ( Char* pathname );
741extern Int VG_(create_and_write) ( Char* pathname );
sewardjde4a1d02002-03-22 01:27:54 +0000742extern void VG_(close) ( Int fd );
743extern Int VG_(read) ( Int fd, void* buf, Int count);
744extern Int VG_(write) ( Int fd, void* buf, Int count);
745
sewardj2e93c502002-04-12 11:12:52 +0000746extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
747
748extern Int VG_(select)( Int n,
749 vki_fd_set* readfds,
750 vki_fd_set* writefds,
751 vki_fd_set* exceptfds,
752 struct vki_timeval * timeout );
753extern Int VG_(nanosleep)( const struct vki_timespec *req,
754 struct vki_timespec *rem );
755
756
sewardjde4a1d02002-03-22 01:27:54 +0000757/* mmap-ery ... */
758extern void* VG_(mmap)( void* start, UInt length,
759 UInt prot, UInt flags, UInt fd, UInt offset );
760
sewardj2e93c502002-04-12 11:12:52 +0000761extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000762
763
764/* Print a (panic) message, and abort. */
765extern void VG_(panic) ( Char* str )
766 __attribute__ ((__noreturn__));
767
768/* Get memory by anonymous mmap. */
sewardje6a25242002-04-21 22:03:07 +0000769extern void* VG_(get_memory_from_mmap) ( Int nBytes );
770
771/* Crude stand-in for the glibc system() call. */
772extern Int VG_(system) ( Char* cmd );
773
sewardjde4a1d02002-03-22 01:27:54 +0000774
775/* Signal stuff. Note that these use the vk_ (kernel) structure
776 definitions, which are different in places from those that glibc
777 defines. Since we're operating right at the kernel interface,
778 glibc's view of the world is entirely irrelevant. */
779extern Int VG_(ksigfillset)( vki_ksigset_t* set );
780extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
781extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
782
783extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
784 vki_ksigset_t* oldset );
785extern Int VG_(ksigaction) ( Int signum,
786 const vki_ksigaction* act,
787 vki_ksigaction* oldact );
788extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
789
790extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
791
792extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
793
794
795
796/* ---------------------------------------------------------------------
797 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
798 vg_from_ucode.c).
799 ------------------------------------------------------------------ */
800
801/* Tags which describe what operands are. */
802typedef
803 enum { TempReg=0, ArchReg=1, RealReg=2,
804 SpillNo=3, Literal=4, Lit16=5,
805 NoValue=6 }
806 Tag;
807
808
809/* Microinstruction opcodes. */
810typedef
811 enum {
812 NOP,
813 GET,
814 PUT,
815 LOAD,
816 STORE,
817 MOV,
818 CMOV, /* Used for cmpxchg and cmov */
819 WIDEN,
820 JMP,
821
822 /* Read/write the %EFLAGS register into a TempReg. */
823 GETF, PUTF,
824
825 ADD, ADC, AND, OR, XOR, SUB, SBB,
826 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
827 NOT, NEG, INC, DEC, BSWAP,
828 CC2VAL,
829
830 /* Not strictly needed, but useful for making better
831 translations of address calculations. */
832 LEA1, /* reg2 := const + reg1 */
833 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
834
835 /* not for translating x86 calls -- only to call helpers */
836 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
837 for CALLM. */
838 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
839 CALLM, /* call to a machine-code helper */
840
841 /* Hack for translating string (REP-) insns. Jump to literal if
842 TempReg/RealReg is zero. */
843 JIFZ,
844
845 /* FPU ops which read/write mem or don't touch mem at all. */
846 FPU_R,
847 FPU_W,
848 FPU,
849
850 /* Advance the simulated %eip by some small (< 128) number. */
851 INCEIP,
852
853 /* uinstrs which are not needed for mere translation of x86 code,
854 only for instrumentation of it. */
855 LOADV,
856 STOREV,
857 GETV,
858 PUTV,
859 TESTV,
860 SETV,
861 /* Get/set the v-bit (and it is only one bit) for the simulated
862 %eflags register. */
863 GETVF,
864 PUTVF,
865
866 /* Do a unary or binary tag op. Only for post-instrumented
867 code. For TAG1, first and only arg is a TempReg, and is both
868 arg and result reg. For TAG2, first arg is src, second is
869 dst, in the normal way; both are TempRegs. In both cases,
870 3rd arg is a RiCHelper with a Lit16 tag. This indicates
871 which tag op to do. */
872 TAG1,
873 TAG2
874 }
875 Opcode;
876
877
878/* Condition codes, observing the Intel encoding. CondAlways is an
879 extra. */
880typedef
881 enum {
882 CondO = 0, /* overflow */
883 CondNO = 1, /* no overflow */
884 CondB = 2, /* below */
885 CondNB = 3, /* not below */
886 CondZ = 4, /* zero */
887 CondNZ = 5, /* not zero */
888 CondBE = 6, /* below or equal */
889 CondNBE = 7, /* not below or equal */
890 CondS = 8, /* negative */
891 ConsNS = 9, /* not negative */
892 CondP = 10, /* parity even */
893 CondNP = 11, /* not parity even */
894 CondL = 12, /* jump less */
895 CondNL = 13, /* not less */
896 CondLE = 14, /* less or equal */
897 CondNLE = 15, /* not less or equal */
898 CondAlways = 16 /* Jump always */
899 }
900 Condcode;
901
902
sewardj2e93c502002-04-12 11:12:52 +0000903/* Descriptions of additional properties of *unconditional* jumps. */
904typedef
905 enum {
906 JmpBoring=0, /* boring unconditional jump */
907 JmpCall=1, /* jump due to an x86 call insn */
908 JmpRet=2, /* jump due to an x86 ret insn */
909 JmpSyscall=3, /* do a system call, then jump */
910 JmpClientReq=4 /* do a client request, then jump */
911 }
912 JmpKind;
913
914
sewardjde4a1d02002-03-22 01:27:54 +0000915/* Flags. User-level code can only read/write O(verflow), S(ign),
916 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
917 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
918 thusly:
919 76543210
920 DOSZACP
921 and bit 7 must always be zero since it is unused.
922*/
923typedef UChar FlagSet;
924
925#define FlagD (1<<6)
926#define FlagO (1<<5)
927#define FlagS (1<<4)
928#define FlagZ (1<<3)
929#define FlagA (1<<2)
930#define FlagC (1<<1)
931#define FlagP (1<<0)
932
933#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
934#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
935#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
936#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
937#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
938#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +0000939#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +0000940#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +0000941#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +0000942
943#define FlagsALL (FlagsOSZACP | FlagD)
944#define FlagsEmpty (FlagSet)0
945
946#define VG_IS_FLAG_SUBSET(set1,set2) \
947 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
948
949#define VG_UNION_FLAG_SETS(set1,set2) \
950 ( ((FlagSet)set1) | ((FlagSet)set2) )
951
952
953
954/* A Micro (u)-instruction. */
955typedef
956 struct {
957 /* word 1 */
958 UInt lit32; /* 32-bit literal */
959
960 /* word 2 */
961 UShort val1; /* first operand */
962 UShort val2; /* second operand */
963
964 /* word 3 */
965 UShort val3; /* third operand */
966 UChar opcode; /* opcode */
967 UChar size; /* data transfer size */
968
969 /* word 4 */
970 FlagSet flags_r; /* :: FlagSet */
971 FlagSet flags_w; /* :: FlagSet */
972 UChar tag1:4; /* first operand tag */
973 UChar tag2:4; /* second operand tag */
974 UChar tag3:4; /* third operand tag */
975 UChar extra4b:4; /* Spare field, used by WIDEN for src
976 -size, and by LEA2 for scale
njn4f9c9342002-04-29 16:03:24 +0000977 (1,2,4 or 8), and by unconditional JMPs for
978 orig x86 instr size if --cachesim=yes */
979
sewardjde4a1d02002-03-22 01:27:54 +0000980
981 /* word 5 */
982 UChar cond; /* condition, for jumps */
983 Bool smc_check:1; /* do a smc test, if writes memory. */
984 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +0000985 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +0000986 }
987 UInstr;
988
989
990/* Expandable arrays of uinstrs. */
991typedef
992 struct {
993 Int used;
994 Int size;
995 UInstr* instrs;
996 Int nextTemp;
997 }
998 UCodeBlock;
999
1000/* Refer to `the last instruction stuffed in', including as an
1001 lvalue. */
1002#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1003
1004/* An invalid temporary number :-) */
1005#define INVALID_TEMPREG 999999999
1006
1007
1008/* ---------------------------------------------------------------------
1009 Exports of vg_demangle.c
1010 ------------------------------------------------------------------ */
1011
1012extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
1013
1014
1015/* ---------------------------------------------------------------------
1016 Exports of vg_from_ucode.c
1017 ------------------------------------------------------------------ */
1018
1019extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
1020
1021
1022/* ---------------------------------------------------------------------
1023 Exports of vg_to_ucode.c
1024 ------------------------------------------------------------------ */
1025
1026extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
1027extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
1028extern Char VG_(nameOfIntSize) ( Int size );
1029extern UInt VG_(extend_s_8to32) ( UInt x );
1030extern Int VG_(getNewTemp) ( UCodeBlock* cb );
1031extern Int VG_(getNewShadow) ( UCodeBlock* cb );
1032
1033#define SHADOW(tempreg) ((tempreg)+1)
1034
1035
1036/* ---------------------------------------------------------------------
1037 Exports of vg_translate.c
1038 ------------------------------------------------------------------ */
1039
sewardj1e8cdc92002-04-18 11:37:52 +00001040extern void VG_(translate) ( ThreadState* tst,
1041 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001042 UInt* orig_size,
1043 Addr* trans_addr,
1044 UInt* trans_size );
1045
1046extern void VG_(emptyUInstr) ( UInstr* u );
1047extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1048extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
1049 Tag tag1, UInt val1 );
1050extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
1051 Tag tag1, UInt val1,
1052 Tag tag2, UInt val2 );
1053extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
1054 Tag tag1, UInt val1,
1055 Tag tag2, UInt val2,
1056 Tag tag3, UInt val3 );
1057extern void VG_(setFlagRW) ( UInstr* u,
1058 FlagSet fr, FlagSet fw );
1059
1060extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1061extern Bool VG_(anyFlagUse) ( UInstr* u );
1062
1063
1064
1065extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1066extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1067
njn4f9c9342002-04-29 16:03:24 +00001068extern UCodeBlock* VG_(allocCodeBlock) ( void );
1069extern void VG_(freeCodeBlock) ( UCodeBlock* cb );
1070extern void VG_(copyUInstr) ( UCodeBlock* cb, UInstr* instr );
1071
sewardjde4a1d02002-03-22 01:27:54 +00001072extern Char* VG_(nameCondcode) ( Condcode cond );
1073extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1074extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1075extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1076extern Int VG_(rankToRealRegNo) ( Int rank );
1077
1078extern void* VG_(jitmalloc) ( Int nbytes );
1079extern void VG_(jitfree) ( void* ptr );
1080
1081
1082/* ---------------------------------------------------------------------
1083 Exports of vg_execontext.c.
1084 ------------------------------------------------------------------ */
1085
1086/* Records the PC and a bit of the call chain. The first 4 %eip
1087 values are used in comparisons do remove duplicate errors, and for
1088 comparing against suppression specifications. The rest are purely
1089 informational (but often important). */
1090
1091typedef
1092 struct _ExeContextRec {
1093 struct _ExeContextRec * next;
1094 /* The size of this array is VG_(clo_backtrace_size); at least
1095 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1096 [1] is its caller, [2] is the caller of [1], etc. */
1097 Addr eips[0];
1098 }
1099 ExeContext;
1100
1101
1102/* Initialise the ExeContext storage mechanism. */
1103extern void VG_(init_ExeContext_storage) ( void );
1104
1105/* Print stats (informational only). */
1106extern void VG_(show_ExeContext_stats) ( void );
1107
1108
1109/* Take a snapshot of the client's stack. Search our collection of
1110 ExeContexts to see if we already have it, and if not, allocate a
1111 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001112extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1113 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001114
1115/* Print an ExeContext. */
1116extern void VG_(pp_ExeContext) ( ExeContext* );
1117
1118/* Compare two ExeContexts, just comparing the top two callers. */
1119extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1120
1121/* Compare two ExeContexts, just comparing the top four callers. */
1122extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1123
1124/* Compare two ExeContexts, comparing all callers. */
1125extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1126
1127
1128
1129/* ---------------------------------------------------------------------
1130 Exports of vg_errcontext.c.
1131 ------------------------------------------------------------------ */
1132
1133extern void VG_(load_suppressions) ( void );
1134extern void VG_(show_all_errors) ( void );
1135extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001136extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1137extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001138extern void VG_(record_address_error) ( Addr a, Int size,
1139 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001140
1141extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001142
1143extern void VG_(record_param_err) ( ThreadState* tst,
1144 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001145 Bool isWriteLack,
1146 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001147extern void VG_(record_user_err) ( ThreadState* tst,
1148 Addr a, Bool isWriteLack );
sewardjde4a1d02002-03-22 01:27:54 +00001149
1150
1151/* The classification of a faulting address. */
1152typedef
1153 enum { Stack, Unknown, Freed, Mallocd, UserG, UserS }
1154 AddrKind;
1155
1156/* Records info about a faulting address. */
1157typedef
1158 struct {
1159 /* ALL */
1160 AddrKind akind;
1161 /* Freed, Mallocd */
1162 Int blksize;
1163 /* Freed, Mallocd */
1164 Int rwoffset;
1165 /* Freed, Mallocd */
1166 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001167 /* Stack */
1168 ThreadId stack_tid;
sewardjde4a1d02002-03-22 01:27:54 +00001169 }
1170 AddrInfo;
1171
1172
1173/* ---------------------------------------------------------------------
1174 Exports of vg_clientperms.c
1175 ------------------------------------------------------------------ */
1176
1177extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1178
sewardj8c824512002-04-14 04:16:48 +00001179extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001180
1181extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1182
1183extern void VG_(show_client_block_stats) ( void );
1184
1185
1186/* ---------------------------------------------------------------------
1187 Exports of vg_procselfmaps.c
1188 ------------------------------------------------------------------ */
1189
1190extern
1191void VG_(read_procselfmaps) (
1192 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1193);
1194
1195
1196/* ---------------------------------------------------------------------
1197 Exports of vg_symtab2.c
1198 ------------------------------------------------------------------ */
1199
1200/* We assume the executable is loaded here ... can't really find
1201 out. There is a hacky sanity check in vg_init_memory_audit()
1202 which should trip up most stupidities.
1203*/
1204#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1205
1206extern void VG_(read_symbols) ( void );
1207extern void VG_(mini_stack_dump) ( ExeContext* ec );
1208extern void VG_(what_obj_and_fun_is_this)
1209 ( Addr a,
1210 Char* obj_buf, Int n_obj_buf,
1211 Char* fun_buf, Int n_fun_buf );
njn4f9c9342002-04-29 16:03:24 +00001212extern Bool VG_(what_line_is_this) ( Addr a,
1213 UChar* filename, Int n_filename,
1214 UInt* lineno );
1215extern Bool VG_(what_fn_is_this) ( Bool no_demangle, Addr a,
1216 Char* fn_name, Int n_fn_name);
sewardjde4a1d02002-03-22 01:27:54 +00001217
1218extern void VG_(symtab_notify_munmap) ( Addr start, UInt length );
1219
1220
1221/* ---------------------------------------------------------------------
1222 Exports of vg_clientmalloc.c
1223 ------------------------------------------------------------------ */
1224
sewardjde4a1d02002-03-22 01:27:54 +00001225typedef
1226 enum {
1227 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001228 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001229 Vg_AllocNewVec = 2
1230 }
1231 VgAllocKind;
1232
1233/* Description of a malloc'd chunk. */
1234typedef
1235 struct _ShadowChunk {
1236 struct _ShadowChunk* next;
1237 ExeContext* where; /* where malloc'd/free'd */
1238 UInt size : 30; /* size requested. */
1239 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1240 Addr data; /* ptr to actual block. */
1241 }
1242 ShadowChunk;
1243
1244extern void VG_(clientmalloc_done) ( void );
1245extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1246extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1247
sewardj2e93c502002-04-12 11:12:52 +00001248/* These are called from the scheduler, when it intercepts a user
1249 request. */
sewardj8c824512002-04-14 04:16:48 +00001250extern void* VG_(client_malloc) ( ThreadState* tst,
1251 UInt size, VgAllocKind kind );
1252extern void* VG_(client_memalign) ( ThreadState* tst,
1253 UInt align, UInt size );
1254extern void VG_(client_free) ( ThreadState* tst,
1255 void* ptrV, VgAllocKind kind );
1256extern void* VG_(client_calloc) ( ThreadState* tst,
1257 UInt nmemb, UInt size1 );
1258extern void* VG_(client_realloc) ( ThreadState* tst,
1259 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001260
1261
1262/* ---------------------------------------------------------------------
1263 Exports of vg_main.c
1264 ------------------------------------------------------------------ */
1265
sewardjde4a1d02002-03-22 01:27:54 +00001266/* A structure used as an intermediary when passing the simulated
1267 CPU's state to some assembly fragments, particularly system calls.
1268 Stuff is copied from baseBlock to here, the assembly magic runs,
1269 and then the inverse copy is done. */
1270
1271extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1272 + 1 /* %eflags */
1273 + 1 /* %eip */
1274 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1275 ];
1276
1277/* Handy fns for doing the copy back and forth. */
1278extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1279extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1280
sewardjde4a1d02002-03-22 01:27:54 +00001281/* Called when some unhandleable client behaviour is detected.
1282 Prints a msg and aborts. */
1283extern void VG_(unimplemented) ( Char* msg );
1284
1285/* The stack on which Valgrind runs. We can't use the same stack as the
1286 simulatee -- that's an important design decision. */
1287extern UInt VG_(stack)[10000];
1288
1289/* Similarly, we have to ask for signals to be delivered on an
1290 alternative stack, since it is possible, although unlikely, that
1291 we'll have to run client code from inside the Valgrind-installed
1292 signal handler. If this happens it will be done by
1293 vg_deliver_signal_immediately(). */
1294extern UInt VG_(sigstack)[10000];
1295
sewardjde4a1d02002-03-22 01:27:54 +00001296/* Holds client's %esp at the point we gained control. From this the
1297 client's argc, argv and envp are deduced. */
1298extern Addr VG_(esp_at_startup);
1299extern Int VG_(client_argc);
1300extern Char** VG_(client_argv);
1301extern Char** VG_(client_envp);
1302
1303/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
1304 don't get traced into. */
1305extern void VG_(mash_LD_PRELOAD_string)( Char* ld_preload_str );
1306
1307/* Something of a function looking for a home ... start up GDB. This
1308 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1309 *client's* stack. This is necessary to give GDB the illusion that
1310 the client program really was running on the real cpu. */
1311extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1312
1313/* Spew out vast amounts of junk during JITting? */
1314extern Bool VG_(disassemble);
1315
1316/* 64-bit counter for the number of basic blocks done. */
1317extern ULong VG_(bbs_done);
1318/* 64-bit counter for the number of bbs to go before a debug exit. */
1319extern ULong VG_(bbs_to_go);
1320
1321/* Counts downwards in vg_run_innerloop. */
1322extern UInt VG_(dispatch_ctr);
1323
sewardjde4a1d02002-03-22 01:27:54 +00001324/* Is the client running on the simulated CPU or the real one? */
1325extern Bool VG_(running_on_simd_CPU); /* Initially False */
1326
1327/* The current LRU epoch. */
1328extern UInt VG_(current_epoch);
1329
sewardj7e87e382002-05-03 19:09:05 +00001330/* This is the ThreadId of the last thread the scheduler ran. */
1331extern ThreadId VG_(last_run_tid);
1332
sewardjde4a1d02002-03-22 01:27:54 +00001333
1334/* --- Counters, for informational purposes only. --- */
1335
1336/* Number of lookups which miss the fast tt helper. */
1337extern UInt VG_(tt_fast_misses);
1338
1339/* Counts for LRU informational messages. */
1340
1341/* Number and total o/t size of new translations this epoch. */
1342extern UInt VG_(this_epoch_in_count);
1343extern UInt VG_(this_epoch_in_osize);
1344extern UInt VG_(this_epoch_in_tsize);
1345/* Number and total o/t size of discarded translations this epoch. */
1346extern UInt VG_(this_epoch_out_count);
1347extern UInt VG_(this_epoch_out_osize);
1348extern UInt VG_(this_epoch_out_tsize);
1349/* Number and total o/t size of translations overall. */
1350extern UInt VG_(overall_in_count);
1351extern UInt VG_(overall_in_osize);
1352extern UInt VG_(overall_in_tsize);
1353/* Number and total o/t size of discards overall. */
1354extern UInt VG_(overall_out_count);
1355extern UInt VG_(overall_out_osize);
1356extern UInt VG_(overall_out_tsize);
1357
1358/* The number of LRU-clearings of TT/TC. */
1359extern UInt VG_(number_of_lrus);
1360
1361/* Counts pertaining to the register allocator. */
1362
1363/* total number of uinstrs input to reg-alloc */
1364extern UInt VG_(uinstrs_prealloc);
1365
1366/* total number of uinstrs added due to spill code */
1367extern UInt VG_(uinstrs_spill);
1368
1369/* number of bbs requiring spill code */
1370extern UInt VG_(translations_needing_spill);
1371
1372/* total of register ranks over all translations */
1373extern UInt VG_(total_reg_rank);
1374
1375/* Counts pertaining to the self-modifying-code detection machinery. */
1376
1377/* Total number of writes checked. */
1378//extern UInt VG_(smc_total_check4s);
1379
1380/* Number of writes which the fast smc check couldn't show were
1381 harmless. */
1382extern UInt VG_(smc_cache_passed);
1383
1384/* Numnber of writes which really did write on original code. */
1385extern UInt VG_(smc_fancy_passed);
1386
1387/* Number of translations discarded as a result. */
1388//extern UInt VG_(smc_discard_count);
1389
1390/* Counts pertaining to internal sanity checking. */
1391extern UInt VG_(sanity_fast_count);
1392extern UInt VG_(sanity_slow_count);
1393
sewardj2e93c502002-04-12 11:12:52 +00001394/* Counts pertaining to the scheduler. */
1395extern UInt VG_(num_scheduling_events_MINOR);
1396extern UInt VG_(num_scheduling_events_MAJOR);
1397
sewardjde4a1d02002-03-22 01:27:54 +00001398
1399/* ---------------------------------------------------------------------
1400 Exports of vg_memory.c
1401 ------------------------------------------------------------------ */
1402
1403extern void VGM_(init_memory_audit) ( void );
1404extern Addr VGM_(curr_dataseg_end);
1405extern void VG_(show_reg_tags) ( void );
1406extern void VG_(detect_memory_leaks) ( void );
1407extern void VG_(done_prof_mem) ( void );
1408
1409/* Set permissions for an address range. Not speed-critical. */
1410extern void VGM_(make_noaccess) ( Addr a, UInt len );
1411extern void VGM_(make_writable) ( Addr a, UInt len );
1412extern void VGM_(make_readable) ( Addr a, UInt len );
1413/* Use with care! (read: use for shmat only) */
1414extern void VGM_(make_readwritable) ( Addr a, UInt len );
1415extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1416 UInt len );
1417
1418/* Check permissions for an address range. Not speed-critical. */
1419extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1420extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1421extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1422
sewardj0c3b53f2002-05-01 01:58:35 +00001423/* Sanity checks which may be done at any time. The scheduler decides
1424 when. */
1425extern void VG_(do_sanity_checks) ( Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001426/* Very cheap ... */
1427extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1428
1429/* These functions are called from generated code. */
1430extern void VG_(helperc_STOREV4) ( UInt, Addr );
1431extern void VG_(helperc_STOREV2) ( UInt, Addr );
1432extern void VG_(helperc_STOREV1) ( UInt, Addr );
1433
1434extern UInt VG_(helperc_LOADV1) ( Addr );
1435extern UInt VG_(helperc_LOADV2) ( Addr );
1436extern UInt VG_(helperc_LOADV4) ( Addr );
1437
1438extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1439extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1440extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1441
1442/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1443 space and pass the addresses and values of all addressible,
1444 defined, aligned words to notify_word. This is the basis for the
1445 leak detector. Returns the number of calls made to notify_word. */
1446UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1447
1448/* Is this address within some small distance below %ESP? Used only
1449 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001450extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001451
1452/* Nasty kludgery to deal with applications which switch stacks,
1453 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001454#define VG_PLAUSIBLE_STACK_SIZE 8000000
1455
sewardjc3bd5f52002-05-01 03:24:23 +00001456/* Needed by the pthreads implementation. */
1457#define VGM_WORD_VALID 0
1458#define VGM_WORD_INVALID 0xFFFFFFFF
1459
sewardjde4a1d02002-03-22 01:27:54 +00001460
1461/* ---------------------------------------------------------------------
1462 Exports of vg_syscall_mem.c
1463 ------------------------------------------------------------------ */
1464
sewardj2e93c502002-04-12 11:12:52 +00001465extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001466
sewardj2e93c502002-04-12 11:12:52 +00001467extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1468 Int syscallno,
1469 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001470
1471extern Bool VG_(is_kerror) ( Int res );
1472
sewardj2e93c502002-04-12 11:12:52 +00001473#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1474 VG_(load_thread_state)(thread_id); \
sewardjde4a1d02002-03-22 01:27:54 +00001475 VG_(copy_baseBlock_to_m_state_static)(); \
1476 VG_(do_syscall)(); \
1477 VG_(copy_m_state_static_to_baseBlock)(); \
sewardj2e93c502002-04-12 11:12:52 +00001478 VG_(save_thread_state)(thread_id); \
1479 result_lvalue = VG_(get_thread_state)(thread_id)->m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001480
1481
1482/* ---------------------------------------------------------------------
1483 Exports of vg_transtab.c
1484 ------------------------------------------------------------------ */
1485
1486/* An entry in the translation table (TT). */
1487typedef
1488 struct {
1489 /* +0 */ Addr orig_addr;
1490 /* +4 */ Addr trans_addr;
1491 /* +8 */ UInt mru_epoch;
1492 /* +12 */ UShort orig_size;
1493 /* +14 */ UShort trans_size;
1494 }
1495 TTEntry;
1496
1497/* The number of basic blocks in an epoch (one age-step). */
1498#define VG_BBS_PER_EPOCH 20000
1499
1500extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1501extern void VG_(maybe_do_lru_pass) ( void );
1502extern void VG_(flush_transtab) ( void );
1503extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1504extern void VG_(add_to_trans_tab) ( TTEntry* tte );
1505
1506extern void VG_(smc_mark_original) ( Addr original_addr,
1507 Int original_len );
1508
1509extern void VG_(init_transtab_and_SMC) ( void );
1510
1511extern void VG_(sanity_check_tc_tt) ( void );
1512extern Addr VG_(search_transtab) ( Addr original_addr );
1513
1514extern void VG_(invalidate_tt_fast)( void );
1515
1516
1517/* ---------------------------------------------------------------------
1518 Exports of vg_vtagops.c
1519 ------------------------------------------------------------------ */
1520
1521/* Lists the names of value-tag operations used in instrumented
1522 code. These are the third argument to TAG1 and TAG2 uinsns. */
1523
1524typedef
1525 enum {
1526 /* Unary. */
1527 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1528 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1529
1530 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1531
1532 VgT_Left4, VgT_Left2, VgT_Left1,
1533
1534 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1535 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1536
1537 /* Binary; 1st is rd; 2nd is rd+wr */
1538 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1539 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1540
1541 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1542 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1543 VgT_DebugFn
1544 }
1545 VgTagOp;
1546
1547extern Char* VG_(nameOfTagOp) ( VgTagOp );
1548extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1549
1550
1551/* ---------------------------------------------------------------------
1552 Exports of vg_syscall.S
1553 ------------------------------------------------------------------ */
1554
1555extern void VG_(do_syscall) ( void );
1556
1557
1558/* ---------------------------------------------------------------------
1559 Exports of vg_startup.S
1560 ------------------------------------------------------------------ */
1561
sewardjde4a1d02002-03-22 01:27:54 +00001562extern void VG_(switch_to_real_CPU) ( void );
1563
sewardj35805422002-04-21 13:05:34 +00001564extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1565 Addr m_esp_at_error,
1566 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001567
1568
1569/* ---------------------------------------------------------------------
1570 Exports of vg_dispatch.S
1571 ------------------------------------------------------------------ */
1572
sewardj2e93c502002-04-12 11:12:52 +00001573/* Run a thread for a (very short) while, until some event happens
1574 which means we need to defer to the scheduler. */
1575extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001576
1577
1578/* ---------------------------------------------------------------------
1579 Exports of vg_helpers.S
1580 ------------------------------------------------------------------ */
1581
sewardjde4a1d02002-03-22 01:27:54 +00001582/* SMC fast checks. */
1583extern void VG_(helper_smc_check4);
1584
1585/* Mul, div, etc, -- we don't codegen these directly. */
1586extern void VG_(helper_idiv_64_32);
1587extern void VG_(helper_div_64_32);
1588extern void VG_(helper_idiv_32_16);
1589extern void VG_(helper_div_32_16);
1590extern void VG_(helper_idiv_16_8);
1591extern void VG_(helper_div_16_8);
1592
1593extern void VG_(helper_imul_32_64);
1594extern void VG_(helper_mul_32_64);
1595extern void VG_(helper_imul_16_32);
1596extern void VG_(helper_mul_16_32);
1597extern void VG_(helper_imul_8_16);
1598extern void VG_(helper_mul_8_16);
1599
1600extern void VG_(helper_CLD);
1601extern void VG_(helper_STD);
1602extern void VG_(helper_get_dirflag);
1603
1604extern void VG_(helper_shldl);
1605extern void VG_(helper_shldw);
1606extern void VG_(helper_shrdl);
1607extern void VG_(helper_shrdw);
1608
1609extern void VG_(helper_RDTSC);
1610extern void VG_(helper_CPUID);
1611
sewardjde4a1d02002-03-22 01:27:54 +00001612extern void VG_(helper_bsf);
1613extern void VG_(helper_bsr);
1614
1615extern void VG_(helper_fstsw_AX);
1616extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001617extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001618extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001619
1620extern void VG_(helper_value_check4_fail);
1621extern void VG_(helper_value_check2_fail);
1622extern void VG_(helper_value_check1_fail);
1623extern void VG_(helper_value_check0_fail);
1624
sewardjbc5b99f2002-04-13 00:08:51 +00001625/* NOT FUNCTIONS; these are bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001626extern void VG_(signalreturn_bogusRA)( void );
sewardjbc5b99f2002-04-13 00:08:51 +00001627extern void VG_(pthreadreturn_bogusRA)( void );
sewardj54cacf02002-04-12 23:24:59 +00001628
njn4f9c9342002-04-29 16:03:24 +00001629/* ---------------------------------------------------------------------
1630 Exports of vg_cachesim.c
1631 ------------------------------------------------------------------ */
1632
1633extern UCodeBlock* VG_(cachesim_instrument)(UCodeBlock* cb_in, Addr orig_addr);
1634
1635typedef struct _iCC iCC;
1636typedef struct _idCC idCC;
1637
1638extern void VG_(init_cachesim) ( void );
1639extern void VG_(show_cachesim_results)( Int client_argc, Char** client_argv );
1640
1641extern void VG_(cachesim_log_non_mem_instr)( iCC* cc );
1642extern void VG_(cachesim_log_mem_instr) ( idCC* cc, Addr data_addr );
sewardjde4a1d02002-03-22 01:27:54 +00001643
1644/* ---------------------------------------------------------------------
1645 The state of the simulated CPU.
1646 ------------------------------------------------------------------ */
1647
1648/* This is the Intel register encoding. */
1649#define R_EAX 0
1650#define R_ECX 1
1651#define R_EDX 2
1652#define R_EBX 3
1653#define R_ESP 4
1654#define R_EBP 5
1655#define R_ESI 6
1656#define R_EDI 7
1657
1658#define R_AL (0+R_EAX)
1659#define R_CL (0+R_ECX)
1660#define R_DL (0+R_EDX)
1661#define R_BL (0+R_EBX)
1662#define R_AH (4+R_EAX)
1663#define R_CH (4+R_ECX)
1664#define R_DH (4+R_EDX)
1665#define R_BH (4+R_EBX)
1666
1667
1668/* ---------------------------------------------------------------------
1669 Offsets into baseBlock for everything which needs to referred to
1670 from generated code. The order of these decls does not imply
1671 what the order of the actual offsets is. The latter is important
1672 and is set up in vg_main.c.
1673 ------------------------------------------------------------------ */
1674
1675/* An array of words. In generated code, %ebp always points to the
1676 start of this array. Useful stuff, like the simulated CPU state,
1677 and the addresses of helper functions, can then be found by
1678 indexing off %ebp. The following declares variables which, at
1679 startup time, are given values denoting offsets into baseBlock.
1680 These offsets are in *words* from the start of baseBlock. */
1681
1682#define VG_BASEBLOCK_WORDS 200
1683
1684extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1685
1686
1687/* -----------------------------------------------------
1688 Read-write parts of baseBlock.
1689 -------------------------------------------------- */
1690
1691/* State of the simulated CPU. */
1692extern Int VGOFF_(m_eax);
1693extern Int VGOFF_(m_ecx);
1694extern Int VGOFF_(m_edx);
1695extern Int VGOFF_(m_ebx);
1696extern Int VGOFF_(m_esp);
1697extern Int VGOFF_(m_ebp);
1698extern Int VGOFF_(m_esi);
1699extern Int VGOFF_(m_edi);
1700extern Int VGOFF_(m_eflags);
1701extern Int VGOFF_(m_fpustate);
1702extern Int VGOFF_(m_eip);
1703
1704/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1705extern Int VGOFF_(spillslots);
1706
1707/* Records the valid bits for the 8 integer regs & flags reg. */
1708extern Int VGOFF_(sh_eax);
1709extern Int VGOFF_(sh_ecx);
1710extern Int VGOFF_(sh_edx);
1711extern Int VGOFF_(sh_ebx);
1712extern Int VGOFF_(sh_esp);
1713extern Int VGOFF_(sh_ebp);
1714extern Int VGOFF_(sh_esi);
1715extern Int VGOFF_(sh_edi);
1716extern Int VGOFF_(sh_eflags);
1717
1718
1719/* -----------------------------------------------------
1720 Read-only parts of baseBlock.
1721 -------------------------------------------------- */
1722
1723/* Offsets of addresses of helper functions. A "helper" function is
1724 one which is called from generated code. */
1725
1726extern Int VGOFF_(helper_idiv_64_32);
1727extern Int VGOFF_(helper_div_64_32);
1728extern Int VGOFF_(helper_idiv_32_16);
1729extern Int VGOFF_(helper_div_32_16);
1730extern Int VGOFF_(helper_idiv_16_8);
1731extern Int VGOFF_(helper_div_16_8);
1732
1733extern Int VGOFF_(helper_imul_32_64);
1734extern Int VGOFF_(helper_mul_32_64);
1735extern Int VGOFF_(helper_imul_16_32);
1736extern Int VGOFF_(helper_mul_16_32);
1737extern Int VGOFF_(helper_imul_8_16);
1738extern Int VGOFF_(helper_mul_8_16);
1739
1740extern Int VGOFF_(helper_CLD);
1741extern Int VGOFF_(helper_STD);
1742extern Int VGOFF_(helper_get_dirflag);
1743
1744extern Int VGOFF_(helper_shldl);
1745extern Int VGOFF_(helper_shldw);
1746extern Int VGOFF_(helper_shrdl);
1747extern Int VGOFF_(helper_shrdw);
1748
1749extern Int VGOFF_(helper_RDTSC);
1750extern Int VGOFF_(helper_CPUID);
1751
sewardjde4a1d02002-03-22 01:27:54 +00001752extern Int VGOFF_(helper_bsf);
1753extern Int VGOFF_(helper_bsr);
1754
1755extern Int VGOFF_(helper_fstsw_AX);
1756extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001757extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001758extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001759
1760extern Int VGOFF_(helper_value_check4_fail);
1761extern Int VGOFF_(helper_value_check2_fail);
1762extern Int VGOFF_(helper_value_check1_fail);
1763extern Int VGOFF_(helper_value_check0_fail);
1764
sewardjde4a1d02002-03-22 01:27:54 +00001765extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1766extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1767extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1768
1769extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1770extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1771extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1772
1773extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1774extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1775extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1776
njn4f9c9342002-04-29 16:03:24 +00001777extern Int VGOFF_(cachesim_log_non_mem_instr);
1778extern Int VGOFF_(cachesim_log_mem_instr);
sewardjde4a1d02002-03-22 01:27:54 +00001779
1780#endif /* ndef __VG_INCLUDE_H */
1781
sewardj3b2736a2002-03-24 12:18:35 +00001782
1783/* ---------------------------------------------------------------------
1784 Finally - autoconf-generated settings
1785 ------------------------------------------------------------------ */
1786
1787#include "config.h"
1788
sewardjde4a1d02002-03-22 01:27:54 +00001789/*--------------------------------------------------------------------*/
1790/*--- end vg_include.h ---*/
1791/*--------------------------------------------------------------------*/