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