blob: b71a1017d53aec96b4a1436a9a99d5cb007c601d [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
440#define VG_USERREQ__SHUTDOWN_VALGRIND 0x4003
sewardj54cacf02002-04-12 23:24:59 +0000441*/
442
443
sewardj2e93c502002-04-12 11:12:52 +0000444/* ---------------------------------------------------------------------
445 Constants pertaining to the simulated CPU state, VG_(baseBlock),
446 which need to go here to avoid ugly circularities.
447 ------------------------------------------------------------------ */
448
449/* How big is the saved FPU state? */
450#define VG_SIZE_OF_FPUSTATE 108
451/* ... and in words ... */
452#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
453
454
455/* ---------------------------------------------------------------------
456 Exports of vg_scheduler.c
457 ------------------------------------------------------------------ */
458
459/* ThreadIds are simply indices into the vg_threads[] array. */
460typedef
461 UInt
462 ThreadId;
463
sewardj6072c362002-04-19 14:40:57 +0000464/* Special magic value for an invalid ThreadId. It corresponds to
465 LinuxThreads using zero as the initial value for
466 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
467#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000468
469typedef
470 enum {
471 VgTs_Empty, /* this slot is not in use */
472 VgTs_Runnable, /* waiting to be scheduled */
473 VgTs_WaitJoiner, /* waiting for someone to do join on me */
474 VgTs_WaitJoinee, /* waiting for the thread I did join on */
475 VgTs_WaitFD, /* waiting for I/O completion on a fd */
476 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000477 VgTs_WaitCV, /* waiting on a condition variable */
sewardj2e93c502002-04-12 11:12:52 +0000478 VgTs_Sleeping /* sleeping for a while */
479 }
480 ThreadStatus;
481
482typedef
483 struct {
sewardj6072c362002-04-19 14:40:57 +0000484 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
485 The thread identity is simply the index in vg_threads[].
486 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000487 that we don't try and allocate or deallocate its stack. For
488 convenience of generating error message, we also put the
489 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000490 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000491 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000492
sewardj5f07b662002-04-23 16:52:51 +0000493 /* Current scheduling status.
494
495 Complications: whenever this is set to VgTs_WaitMX, you
496 should also set .m_edx to whatever the required return value
497 is for pthread_mutex_lock / pthread_cond_timedwait for when
498 the mutex finally gets unblocked. */
sewardj2e93c502002-04-12 11:12:52 +0000499 ThreadStatus status;
500
501 /* Identity of joiner (thread who called join on me), or
502 VG_INVALID_THREADID if no one asked to join yet. */
503 ThreadId joiner;
504
sewardj3b5d8862002-04-20 13:53:23 +0000505 /* When .status == WaitMX, points to the mutex I am waiting for.
506 When .status == WaitCV, points to the mutex associated with
507 the condition variable indicated by the .associated_cv field.
508 In all other cases, should be NULL. */
509 void* /* pthread_mutex_t* */ associated_mx;
510
511 /* When .status == WaitCV, points to the condition variable I am
512 waiting for. In all other cases, should be NULL. */
513 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000514
sewardj5f07b662002-04-23 16:52:51 +0000515 /* If VgTs_Sleeping, this is when we should wake up, measured in
516 milliseconds as supplied by VG_(read_millisecond_counter).
517
518 If VgTs_WaitCV, this indicates the time at which
519 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
520 this means infinitely far in the future, viz,
521 pthread_cond_wait. */
522 UInt awaken_at;
sewardj2e93c502002-04-12 11:12:52 +0000523
524 /* return value */
525 void* retval;
526
sewardj5f07b662002-04-23 16:52:51 +0000527 /* thread-specific data */
528 void* specifics[VG_N_THREAD_KEYS];
529
sewardj2e93c502002-04-12 11:12:52 +0000530 /* Stacks. When a thread slot is freed, we don't deallocate its
531 stack; we just leave it lying around for the next use of the
532 slot. If the next use of the slot requires a larger stack,
533 only then is the old one deallocated and a new one
534 allocated.
535
536 For the main thread (threadid == 0), this mechanism doesn't
537 apply. We don't know the size of the stack since we didn't
538 allocate it, and furthermore we never reallocate it. */
539
540 /* The allocated size of this thread's stack (permanently zero
541 if this is ThreadId == 0, since we didn't allocate its stack) */
542 UInt stack_size;
543
544 /* Address of the lowest word in this thread's stack. NULL means
545 not allocated yet.
546 */
547 Addr stack_base;
548
sewardj1e8cdc92002-04-18 11:37:52 +0000549 /* Address of the highest legitimate word in this stack. This is
550 used for error messages only -- not critical for execution
551 correctness. Is is set for all stacks, specifically including
552 ThreadId == 0 (the main thread). */
553 Addr stack_highest_word;
554
sewardj2e93c502002-04-12 11:12:52 +0000555 /* Saved machine context. */
556 UInt m_eax;
557 UInt m_ebx;
558 UInt m_ecx;
559 UInt m_edx;
560 UInt m_esi;
561 UInt m_edi;
562 UInt m_ebp;
563 UInt m_esp;
564 UInt m_eflags;
565 UInt m_eip;
566 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
567
568 UInt sh_eax;
569 UInt sh_ebx;
570 UInt sh_ecx;
571 UInt sh_edx;
572 UInt sh_esi;
573 UInt sh_edi;
574 UInt sh_ebp;
575 UInt sh_esp;
576 UInt sh_eflags;
577 }
578 ThreadState;
579
580
581/* Copy the specified thread's state into VG_(baseBlock) in
582 preparation for running it. */
583extern void VG_(load_thread_state)( ThreadId );
584
585/* Save the specified thread's state back in VG_(baseBlock), and fill
586 VG_(baseBlock) with junk, for sanity-check reasons. */
587extern void VG_(save_thread_state)( ThreadId );
588
589/* Get the thread state block for the specified thread. */
590extern ThreadState* VG_(get_thread_state)( ThreadId );
591
sewardj1e8cdc92002-04-18 11:37:52 +0000592/* And for the currently running one, if valid. */
593extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000594
sewardj1e8cdc92002-04-18 11:37:52 +0000595/* Similarly ... */
596extern ThreadId VG_(get_current_tid) ( void );
597
598/* Which thread is this address in the stack of, if any? Used for
599 error message generation. */
600extern ThreadId VG_(identify_stack_addr)( Addr a );
601
sewardj2e93c502002-04-12 11:12:52 +0000602
603/* Return codes from the scheduler. */
604typedef
605 enum { VgSrc_Deadlock, VgSrc_Shutdown, VgSrc_BbsDone }
606 VgSchedReturnCode;
607
608/* The scheduler. */
609extern VgSchedReturnCode VG_(scheduler) ( void );
610
611extern void VG_(scheduler_init) ( void );
612
sewardj15a43e12002-04-17 19:35:12 +0000613extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000614
615/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
616extern jmp_buf VG_(scheduler_jmpbuf);
617/* ... and if so, here's the signal which caused it to do so. */
618extern Int VG_(longjmpd_on_signal);
619
620
621/* We check that the initial stack, which we can't move, is allocated
622 here. VG_(scheduler_init) checks this.
623*/
sewardjebc82332002-04-24 14:44:23 +0000624#define VG_STARTUP_STACK_MASK (Addr)0xBFF80000
sewardj2e93c502002-04-12 11:12:52 +0000625
626
627/* The red-zone size which we put at the bottom (highest address) of
628 thread stacks, for paranoia reasons. This can be arbitrary, and
629 doesn't really need to be set at compile time. */
630#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
631
632#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
633 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
634
635
636
637/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000638 Exports of vg_signals.c
639 ------------------------------------------------------------------ */
640
sewardjde4a1d02002-03-22 01:27:54 +0000641extern void VG_(sigstartup_actions) ( void );
642
sewardj14e03422002-04-24 19:51:31 +0000643extern Bool VG_(deliver_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000644extern void VG_(unblock_host_signal) ( Int sigNo );
645
646
647/* Fake system calls for signal handling. */
sewardj2e93c502002-04-12 11:12:52 +0000648extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000649extern void VG_(do__NR_sigprocmask) ( Int how, vki_ksigset_t* set );
650
sewardj2e93c502002-04-12 11:12:52 +0000651/* Modify the current thread's state once we have detected it is
652 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000653extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000654
sewardj2e93c502002-04-12 11:12:52 +0000655/* Handy utilities to block/restore all host signals. */
656extern void VG_(block_all_host_signals)
657 ( /* OUT */ vki_ksigset_t* saved_mask );
658extern void VG_(restore_host_signals)
659 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000660
661/* ---------------------------------------------------------------------
662 Exports of vg_mylibc.c
663 ------------------------------------------------------------------ */
664
665
666#define NULL ((void*)0)
667
668extern void VG_(exit)( Int status )
669 __attribute__ ((__noreturn__));
670
671extern void VG_(printf) ( const char *format, ... );
672/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
673
674extern void VG_(sprintf) ( Char* buf, Char *format, ... );
675
676extern void VG_(vprintf) ( void(*send)(Char),
677 const Char *format, va_list vargs );
678
679extern Bool VG_(isspace) ( Char c );
680
681extern Int VG_(strlen) ( const Char* str );
682
683extern Long VG_(atoll) ( Char* str );
684
685extern Char* VG_(strcat) ( Char* dest, const Char* src );
686extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
687extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
688
689extern Char* VG_(strcpy) ( Char* dest, const Char* src );
690
691extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
692extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
693
694extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
695extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
696
697extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
698extern Char* VG_(strchr) ( const Char* s, Char c );
699extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
700
701extern Char* VG_(getenv) ( Char* name );
702extern Int VG_(getpid) ( void );
sewardj5f07b662002-04-23 16:52:51 +0000703
704extern void VG_(start_rdtsc_calibration) ( void );
705extern void VG_(end_rdtsc_calibration) ( void );
706extern UInt VG_(read_millisecond_timer) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000707
708
709extern Char VG_(toupper) ( Char c );
710
711extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
712
713extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
714
715extern Bool VG_(stringMatch) ( Char* pat, Char* str );
716
717
718#define __STRING(x) #x
719
720/* Asserts are permanently enabled. Hurrah! */
721#define vg_assert(expr) \
722 ((void) ((expr) ? 0 : \
723 (VG_(assert_fail) (__STRING(expr), \
724 __FILE__, __LINE__, \
725 __PRETTY_FUNCTION__), 0)))
726
727extern void VG_(assert_fail) ( Char* expr, Char* file,
728 Int line, Char* fn )
729 __attribute__ ((__noreturn__));
730
njn4f9c9342002-04-29 16:03:24 +0000731/* Reading and writing files. */
sewardjde4a1d02002-03-22 01:27:54 +0000732extern Int VG_(open_read) ( Char* pathname );
njn4f9c9342002-04-29 16:03:24 +0000733extern Int VG_(open_write) ( Char* pathname );
734extern Int VG_(create_and_write) ( Char* pathname );
sewardjde4a1d02002-03-22 01:27:54 +0000735extern void VG_(close) ( Int fd );
736extern Int VG_(read) ( Int fd, void* buf, Int count);
737extern Int VG_(write) ( Int fd, void* buf, Int count);
738
sewardj2e93c502002-04-12 11:12:52 +0000739extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
740
741extern Int VG_(select)( Int n,
742 vki_fd_set* readfds,
743 vki_fd_set* writefds,
744 vki_fd_set* exceptfds,
745 struct vki_timeval * timeout );
746extern Int VG_(nanosleep)( const struct vki_timespec *req,
747 struct vki_timespec *rem );
748
749
sewardjde4a1d02002-03-22 01:27:54 +0000750/* mmap-ery ... */
751extern void* VG_(mmap)( void* start, UInt length,
752 UInt prot, UInt flags, UInt fd, UInt offset );
753
sewardj2e93c502002-04-12 11:12:52 +0000754extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000755
756
757/* Print a (panic) message, and abort. */
758extern void VG_(panic) ( Char* str )
759 __attribute__ ((__noreturn__));
760
761/* Get memory by anonymous mmap. */
sewardje6a25242002-04-21 22:03:07 +0000762extern void* VG_(get_memory_from_mmap) ( Int nBytes );
763
764/* Crude stand-in for the glibc system() call. */
765extern Int VG_(system) ( Char* cmd );
766
sewardjde4a1d02002-03-22 01:27:54 +0000767
768/* Signal stuff. Note that these use the vk_ (kernel) structure
769 definitions, which are different in places from those that glibc
770 defines. Since we're operating right at the kernel interface,
771 glibc's view of the world is entirely irrelevant. */
772extern Int VG_(ksigfillset)( vki_ksigset_t* set );
773extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
774extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
775
776extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
777 vki_ksigset_t* oldset );
778extern Int VG_(ksigaction) ( Int signum,
779 const vki_ksigaction* act,
780 vki_ksigaction* oldact );
781extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
782
783extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
784
785extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
786
787
788
789/* ---------------------------------------------------------------------
790 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
791 vg_from_ucode.c).
792 ------------------------------------------------------------------ */
793
794/* Tags which describe what operands are. */
795typedef
796 enum { TempReg=0, ArchReg=1, RealReg=2,
797 SpillNo=3, Literal=4, Lit16=5,
798 NoValue=6 }
799 Tag;
800
801
802/* Microinstruction opcodes. */
803typedef
804 enum {
805 NOP,
806 GET,
807 PUT,
808 LOAD,
809 STORE,
810 MOV,
811 CMOV, /* Used for cmpxchg and cmov */
812 WIDEN,
813 JMP,
814
815 /* Read/write the %EFLAGS register into a TempReg. */
816 GETF, PUTF,
817
818 ADD, ADC, AND, OR, XOR, SUB, SBB,
819 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
820 NOT, NEG, INC, DEC, BSWAP,
821 CC2VAL,
822
823 /* Not strictly needed, but useful for making better
824 translations of address calculations. */
825 LEA1, /* reg2 := const + reg1 */
826 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
827
828 /* not for translating x86 calls -- only to call helpers */
829 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
830 for CALLM. */
831 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
832 CALLM, /* call to a machine-code helper */
833
834 /* Hack for translating string (REP-) insns. Jump to literal if
835 TempReg/RealReg is zero. */
836 JIFZ,
837
838 /* FPU ops which read/write mem or don't touch mem at all. */
839 FPU_R,
840 FPU_W,
841 FPU,
842
843 /* Advance the simulated %eip by some small (< 128) number. */
844 INCEIP,
845
846 /* uinstrs which are not needed for mere translation of x86 code,
847 only for instrumentation of it. */
848 LOADV,
849 STOREV,
850 GETV,
851 PUTV,
852 TESTV,
853 SETV,
854 /* Get/set the v-bit (and it is only one bit) for the simulated
855 %eflags register. */
856 GETVF,
857 PUTVF,
858
859 /* Do a unary or binary tag op. Only for post-instrumented
860 code. For TAG1, first and only arg is a TempReg, and is both
861 arg and result reg. For TAG2, first arg is src, second is
862 dst, in the normal way; both are TempRegs. In both cases,
863 3rd arg is a RiCHelper with a Lit16 tag. This indicates
864 which tag op to do. */
865 TAG1,
866 TAG2
867 }
868 Opcode;
869
870
871/* Condition codes, observing the Intel encoding. CondAlways is an
872 extra. */
873typedef
874 enum {
875 CondO = 0, /* overflow */
876 CondNO = 1, /* no overflow */
877 CondB = 2, /* below */
878 CondNB = 3, /* not below */
879 CondZ = 4, /* zero */
880 CondNZ = 5, /* not zero */
881 CondBE = 6, /* below or equal */
882 CondNBE = 7, /* not below or equal */
883 CondS = 8, /* negative */
884 ConsNS = 9, /* not negative */
885 CondP = 10, /* parity even */
886 CondNP = 11, /* not parity even */
887 CondL = 12, /* jump less */
888 CondNL = 13, /* not less */
889 CondLE = 14, /* less or equal */
890 CondNLE = 15, /* not less or equal */
891 CondAlways = 16 /* Jump always */
892 }
893 Condcode;
894
895
sewardj2e93c502002-04-12 11:12:52 +0000896/* Descriptions of additional properties of *unconditional* jumps. */
897typedef
898 enum {
899 JmpBoring=0, /* boring unconditional jump */
900 JmpCall=1, /* jump due to an x86 call insn */
901 JmpRet=2, /* jump due to an x86 ret insn */
902 JmpSyscall=3, /* do a system call, then jump */
903 JmpClientReq=4 /* do a client request, then jump */
904 }
905 JmpKind;
906
907
sewardjde4a1d02002-03-22 01:27:54 +0000908/* Flags. User-level code can only read/write O(verflow), S(ign),
909 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
910 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
911 thusly:
912 76543210
913 DOSZACP
914 and bit 7 must always be zero since it is unused.
915*/
916typedef UChar FlagSet;
917
918#define FlagD (1<<6)
919#define FlagO (1<<5)
920#define FlagS (1<<4)
921#define FlagZ (1<<3)
922#define FlagA (1<<2)
923#define FlagC (1<<1)
924#define FlagP (1<<0)
925
926#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
927#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
928#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
929#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
930#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
931#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +0000932#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +0000933#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +0000934#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +0000935
936#define FlagsALL (FlagsOSZACP | FlagD)
937#define FlagsEmpty (FlagSet)0
938
939#define VG_IS_FLAG_SUBSET(set1,set2) \
940 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
941
942#define VG_UNION_FLAG_SETS(set1,set2) \
943 ( ((FlagSet)set1) | ((FlagSet)set2) )
944
945
946
947/* A Micro (u)-instruction. */
948typedef
949 struct {
950 /* word 1 */
951 UInt lit32; /* 32-bit literal */
952
953 /* word 2 */
954 UShort val1; /* first operand */
955 UShort val2; /* second operand */
956
957 /* word 3 */
958 UShort val3; /* third operand */
959 UChar opcode; /* opcode */
960 UChar size; /* data transfer size */
961
962 /* word 4 */
963 FlagSet flags_r; /* :: FlagSet */
964 FlagSet flags_w; /* :: FlagSet */
965 UChar tag1:4; /* first operand tag */
966 UChar tag2:4; /* second operand tag */
967 UChar tag3:4; /* third operand tag */
968 UChar extra4b:4; /* Spare field, used by WIDEN for src
969 -size, and by LEA2 for scale
njn4f9c9342002-04-29 16:03:24 +0000970 (1,2,4 or 8), and by unconditional JMPs for
971 orig x86 instr size if --cachesim=yes */
972
sewardjde4a1d02002-03-22 01:27:54 +0000973
974 /* word 5 */
975 UChar cond; /* condition, for jumps */
976 Bool smc_check:1; /* do a smc test, if writes memory. */
977 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +0000978 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +0000979 }
980 UInstr;
981
982
983/* Expandable arrays of uinstrs. */
984typedef
985 struct {
986 Int used;
987 Int size;
988 UInstr* instrs;
989 Int nextTemp;
990 }
991 UCodeBlock;
992
993/* Refer to `the last instruction stuffed in', including as an
994 lvalue. */
995#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
996
997/* An invalid temporary number :-) */
998#define INVALID_TEMPREG 999999999
999
1000
1001/* ---------------------------------------------------------------------
1002 Exports of vg_demangle.c
1003 ------------------------------------------------------------------ */
1004
1005extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
1006
1007
1008/* ---------------------------------------------------------------------
1009 Exports of vg_from_ucode.c
1010 ------------------------------------------------------------------ */
1011
1012extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
1013
1014
1015/* ---------------------------------------------------------------------
1016 Exports of vg_to_ucode.c
1017 ------------------------------------------------------------------ */
1018
1019extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
1020extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
1021extern Char VG_(nameOfIntSize) ( Int size );
1022extern UInt VG_(extend_s_8to32) ( UInt x );
1023extern Int VG_(getNewTemp) ( UCodeBlock* cb );
1024extern Int VG_(getNewShadow) ( UCodeBlock* cb );
1025
1026#define SHADOW(tempreg) ((tempreg)+1)
1027
1028
1029/* ---------------------------------------------------------------------
1030 Exports of vg_translate.c
1031 ------------------------------------------------------------------ */
1032
sewardj1e8cdc92002-04-18 11:37:52 +00001033extern void VG_(translate) ( ThreadState* tst,
1034 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001035 UInt* orig_size,
1036 Addr* trans_addr,
1037 UInt* trans_size );
1038
1039extern void VG_(emptyUInstr) ( UInstr* u );
1040extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1041extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
1042 Tag tag1, UInt val1 );
1043extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
1044 Tag tag1, UInt val1,
1045 Tag tag2, UInt val2 );
1046extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
1047 Tag tag1, UInt val1,
1048 Tag tag2, UInt val2,
1049 Tag tag3, UInt val3 );
1050extern void VG_(setFlagRW) ( UInstr* u,
1051 FlagSet fr, FlagSet fw );
1052
1053extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1054extern Bool VG_(anyFlagUse) ( UInstr* u );
1055
1056
1057
1058extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1059extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1060
njn4f9c9342002-04-29 16:03:24 +00001061extern UCodeBlock* VG_(allocCodeBlock) ( void );
1062extern void VG_(freeCodeBlock) ( UCodeBlock* cb );
1063extern void VG_(copyUInstr) ( UCodeBlock* cb, UInstr* instr );
1064
sewardjde4a1d02002-03-22 01:27:54 +00001065extern Char* VG_(nameCondcode) ( Condcode cond );
1066extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1067extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1068extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1069extern Int VG_(rankToRealRegNo) ( Int rank );
1070
1071extern void* VG_(jitmalloc) ( Int nbytes );
1072extern void VG_(jitfree) ( void* ptr );
1073
1074
1075/* ---------------------------------------------------------------------
1076 Exports of vg_execontext.c.
1077 ------------------------------------------------------------------ */
1078
1079/* Records the PC and a bit of the call chain. The first 4 %eip
1080 values are used in comparisons do remove duplicate errors, and for
1081 comparing against suppression specifications. The rest are purely
1082 informational (but often important). */
1083
1084typedef
1085 struct _ExeContextRec {
1086 struct _ExeContextRec * next;
1087 /* The size of this array is VG_(clo_backtrace_size); at least
1088 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1089 [1] is its caller, [2] is the caller of [1], etc. */
1090 Addr eips[0];
1091 }
1092 ExeContext;
1093
1094
1095/* Initialise the ExeContext storage mechanism. */
1096extern void VG_(init_ExeContext_storage) ( void );
1097
1098/* Print stats (informational only). */
1099extern void VG_(show_ExeContext_stats) ( void );
1100
1101
1102/* Take a snapshot of the client's stack. Search our collection of
1103 ExeContexts to see if we already have it, and if not, allocate a
1104 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001105extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1106 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001107
1108/* Print an ExeContext. */
1109extern void VG_(pp_ExeContext) ( ExeContext* );
1110
1111/* Compare two ExeContexts, just comparing the top two callers. */
1112extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1113
1114/* Compare two ExeContexts, just comparing the top four callers. */
1115extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1116
1117/* Compare two ExeContexts, comparing all callers. */
1118extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1119
1120
1121
1122/* ---------------------------------------------------------------------
1123 Exports of vg_errcontext.c.
1124 ------------------------------------------------------------------ */
1125
1126extern void VG_(load_suppressions) ( void );
1127extern void VG_(show_all_errors) ( void );
1128extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001129extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1130extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001131extern void VG_(record_address_error) ( Addr a, Int size,
1132 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001133
1134extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001135
1136extern void VG_(record_param_err) ( ThreadState* tst,
1137 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001138 Bool isWriteLack,
1139 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001140extern void VG_(record_user_err) ( ThreadState* tst,
1141 Addr a, Bool isWriteLack );
sewardjde4a1d02002-03-22 01:27:54 +00001142
1143
1144/* The classification of a faulting address. */
1145typedef
1146 enum { Stack, Unknown, Freed, Mallocd, UserG, UserS }
1147 AddrKind;
1148
1149/* Records info about a faulting address. */
1150typedef
1151 struct {
1152 /* ALL */
1153 AddrKind akind;
1154 /* Freed, Mallocd */
1155 Int blksize;
1156 /* Freed, Mallocd */
1157 Int rwoffset;
1158 /* Freed, Mallocd */
1159 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001160 /* Stack */
1161 ThreadId stack_tid;
sewardjde4a1d02002-03-22 01:27:54 +00001162 }
1163 AddrInfo;
1164
1165
1166/* ---------------------------------------------------------------------
1167 Exports of vg_clientperms.c
1168 ------------------------------------------------------------------ */
1169
1170extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1171
sewardj8c824512002-04-14 04:16:48 +00001172extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001173
1174extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1175
1176extern void VG_(show_client_block_stats) ( void );
1177
1178
1179/* ---------------------------------------------------------------------
1180 Exports of vg_procselfmaps.c
1181 ------------------------------------------------------------------ */
1182
1183extern
1184void VG_(read_procselfmaps) (
1185 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1186);
1187
1188
1189/* ---------------------------------------------------------------------
1190 Exports of vg_symtab2.c
1191 ------------------------------------------------------------------ */
1192
1193/* We assume the executable is loaded here ... can't really find
1194 out. There is a hacky sanity check in vg_init_memory_audit()
1195 which should trip up most stupidities.
1196*/
1197#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1198
1199extern void VG_(read_symbols) ( void );
1200extern void VG_(mini_stack_dump) ( ExeContext* ec );
1201extern void VG_(what_obj_and_fun_is_this)
1202 ( Addr a,
1203 Char* obj_buf, Int n_obj_buf,
1204 Char* fun_buf, Int n_fun_buf );
njn4f9c9342002-04-29 16:03:24 +00001205extern Bool VG_(what_line_is_this) ( Addr a,
1206 UChar* filename, Int n_filename,
1207 UInt* lineno );
1208extern Bool VG_(what_fn_is_this) ( Bool no_demangle, Addr a,
1209 Char* fn_name, Int n_fn_name);
sewardjde4a1d02002-03-22 01:27:54 +00001210
1211extern void VG_(symtab_notify_munmap) ( Addr start, UInt length );
1212
1213
1214/* ---------------------------------------------------------------------
1215 Exports of vg_clientmalloc.c
1216 ------------------------------------------------------------------ */
1217
sewardjde4a1d02002-03-22 01:27:54 +00001218typedef
1219 enum {
1220 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001221 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001222 Vg_AllocNewVec = 2
1223 }
1224 VgAllocKind;
1225
1226/* Description of a malloc'd chunk. */
1227typedef
1228 struct _ShadowChunk {
1229 struct _ShadowChunk* next;
1230 ExeContext* where; /* where malloc'd/free'd */
1231 UInt size : 30; /* size requested. */
1232 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1233 Addr data; /* ptr to actual block. */
1234 }
1235 ShadowChunk;
1236
1237extern void VG_(clientmalloc_done) ( void );
1238extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1239extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1240
sewardj2e93c502002-04-12 11:12:52 +00001241/* These are called from the scheduler, when it intercepts a user
1242 request. */
sewardj8c824512002-04-14 04:16:48 +00001243extern void* VG_(client_malloc) ( ThreadState* tst,
1244 UInt size, VgAllocKind kind );
1245extern void* VG_(client_memalign) ( ThreadState* tst,
1246 UInt align, UInt size );
1247extern void VG_(client_free) ( ThreadState* tst,
1248 void* ptrV, VgAllocKind kind );
1249extern void* VG_(client_calloc) ( ThreadState* tst,
1250 UInt nmemb, UInt size1 );
1251extern void* VG_(client_realloc) ( ThreadState* tst,
1252 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001253
1254
1255/* ---------------------------------------------------------------------
1256 Exports of vg_main.c
1257 ------------------------------------------------------------------ */
1258
sewardjde4a1d02002-03-22 01:27:54 +00001259/* A structure used as an intermediary when passing the simulated
1260 CPU's state to some assembly fragments, particularly system calls.
1261 Stuff is copied from baseBlock to here, the assembly magic runs,
1262 and then the inverse copy is done. */
1263
1264extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1265 + 1 /* %eflags */
1266 + 1 /* %eip */
1267 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1268 ];
1269
1270/* Handy fns for doing the copy back and forth. */
1271extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1272extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1273
sewardjde4a1d02002-03-22 01:27:54 +00001274/* Called when some unhandleable client behaviour is detected.
1275 Prints a msg and aborts. */
1276extern void VG_(unimplemented) ( Char* msg );
1277
1278/* The stack on which Valgrind runs. We can't use the same stack as the
1279 simulatee -- that's an important design decision. */
1280extern UInt VG_(stack)[10000];
1281
1282/* Similarly, we have to ask for signals to be delivered on an
1283 alternative stack, since it is possible, although unlikely, that
1284 we'll have to run client code from inside the Valgrind-installed
1285 signal handler. If this happens it will be done by
1286 vg_deliver_signal_immediately(). */
1287extern UInt VG_(sigstack)[10000];
1288
sewardjde4a1d02002-03-22 01:27:54 +00001289/* Holds client's %esp at the point we gained control. From this the
1290 client's argc, argv and envp are deduced. */
1291extern Addr VG_(esp_at_startup);
1292extern Int VG_(client_argc);
1293extern Char** VG_(client_argv);
1294extern Char** VG_(client_envp);
1295
1296/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
1297 don't get traced into. */
1298extern void VG_(mash_LD_PRELOAD_string)( Char* ld_preload_str );
1299
1300/* Something of a function looking for a home ... start up GDB. This
1301 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1302 *client's* stack. This is necessary to give GDB the illusion that
1303 the client program really was running on the real cpu. */
1304extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1305
1306/* Spew out vast amounts of junk during JITting? */
1307extern Bool VG_(disassemble);
1308
1309/* 64-bit counter for the number of basic blocks done. */
1310extern ULong VG_(bbs_done);
1311/* 64-bit counter for the number of bbs to go before a debug exit. */
1312extern ULong VG_(bbs_to_go);
1313
1314/* Counts downwards in vg_run_innerloop. */
1315extern UInt VG_(dispatch_ctr);
1316
sewardjde4a1d02002-03-22 01:27:54 +00001317/* Is the client running on the simulated CPU or the real one? */
1318extern Bool VG_(running_on_simd_CPU); /* Initially False */
1319
1320/* The current LRU epoch. */
1321extern UInt VG_(current_epoch);
1322
1323
1324/* --- Counters, for informational purposes only. --- */
1325
1326/* Number of lookups which miss the fast tt helper. */
1327extern UInt VG_(tt_fast_misses);
1328
1329/* Counts for LRU informational messages. */
1330
1331/* Number and total o/t size of new translations this epoch. */
1332extern UInt VG_(this_epoch_in_count);
1333extern UInt VG_(this_epoch_in_osize);
1334extern UInt VG_(this_epoch_in_tsize);
1335/* Number and total o/t size of discarded translations this epoch. */
1336extern UInt VG_(this_epoch_out_count);
1337extern UInt VG_(this_epoch_out_osize);
1338extern UInt VG_(this_epoch_out_tsize);
1339/* Number and total o/t size of translations overall. */
1340extern UInt VG_(overall_in_count);
1341extern UInt VG_(overall_in_osize);
1342extern UInt VG_(overall_in_tsize);
1343/* Number and total o/t size of discards overall. */
1344extern UInt VG_(overall_out_count);
1345extern UInt VG_(overall_out_osize);
1346extern UInt VG_(overall_out_tsize);
1347
1348/* The number of LRU-clearings of TT/TC. */
1349extern UInt VG_(number_of_lrus);
1350
1351/* Counts pertaining to the register allocator. */
1352
1353/* total number of uinstrs input to reg-alloc */
1354extern UInt VG_(uinstrs_prealloc);
1355
1356/* total number of uinstrs added due to spill code */
1357extern UInt VG_(uinstrs_spill);
1358
1359/* number of bbs requiring spill code */
1360extern UInt VG_(translations_needing_spill);
1361
1362/* total of register ranks over all translations */
1363extern UInt VG_(total_reg_rank);
1364
1365/* Counts pertaining to the self-modifying-code detection machinery. */
1366
1367/* Total number of writes checked. */
1368//extern UInt VG_(smc_total_check4s);
1369
1370/* Number of writes which the fast smc check couldn't show were
1371 harmless. */
1372extern UInt VG_(smc_cache_passed);
1373
1374/* Numnber of writes which really did write on original code. */
1375extern UInt VG_(smc_fancy_passed);
1376
1377/* Number of translations discarded as a result. */
1378//extern UInt VG_(smc_discard_count);
1379
1380/* Counts pertaining to internal sanity checking. */
1381extern UInt VG_(sanity_fast_count);
1382extern UInt VG_(sanity_slow_count);
1383
sewardj2e93c502002-04-12 11:12:52 +00001384/* Counts pertaining to the scheduler. */
1385extern UInt VG_(num_scheduling_events_MINOR);
1386extern UInt VG_(num_scheduling_events_MAJOR);
1387
sewardjde4a1d02002-03-22 01:27:54 +00001388
1389/* ---------------------------------------------------------------------
1390 Exports of vg_memory.c
1391 ------------------------------------------------------------------ */
1392
1393extern void VGM_(init_memory_audit) ( void );
1394extern Addr VGM_(curr_dataseg_end);
1395extern void VG_(show_reg_tags) ( void );
1396extern void VG_(detect_memory_leaks) ( void );
1397extern void VG_(done_prof_mem) ( void );
1398
1399/* Set permissions for an address range. Not speed-critical. */
1400extern void VGM_(make_noaccess) ( Addr a, UInt len );
1401extern void VGM_(make_writable) ( Addr a, UInt len );
1402extern void VGM_(make_readable) ( Addr a, UInt len );
1403/* Use with care! (read: use for shmat only) */
1404extern void VGM_(make_readwritable) ( Addr a, UInt len );
1405extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1406 UInt len );
1407
1408/* Check permissions for an address range. Not speed-critical. */
1409extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1410extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1411extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1412
sewardj0c3b53f2002-05-01 01:58:35 +00001413/* Sanity checks which may be done at any time. The scheduler decides
1414 when. */
1415extern void VG_(do_sanity_checks) ( Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001416/* Very cheap ... */
1417extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1418
1419/* These functions are called from generated code. */
1420extern void VG_(helperc_STOREV4) ( UInt, Addr );
1421extern void VG_(helperc_STOREV2) ( UInt, Addr );
1422extern void VG_(helperc_STOREV1) ( UInt, Addr );
1423
1424extern UInt VG_(helperc_LOADV1) ( Addr );
1425extern UInt VG_(helperc_LOADV2) ( Addr );
1426extern UInt VG_(helperc_LOADV4) ( Addr );
1427
1428extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1429extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1430extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1431
1432/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1433 space and pass the addresses and values of all addressible,
1434 defined, aligned words to notify_word. This is the basis for the
1435 leak detector. Returns the number of calls made to notify_word. */
1436UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1437
1438/* Is this address within some small distance below %ESP? Used only
1439 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001440extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001441
1442/* Nasty kludgery to deal with applications which switch stacks,
1443 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001444#define VG_PLAUSIBLE_STACK_SIZE 8000000
1445
sewardjde4a1d02002-03-22 01:27:54 +00001446
1447/* ---------------------------------------------------------------------
1448 Exports of vg_syscall_mem.c
1449 ------------------------------------------------------------------ */
1450
sewardj2e93c502002-04-12 11:12:52 +00001451extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001452
sewardj2e93c502002-04-12 11:12:52 +00001453extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1454 Int syscallno,
1455 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001456
1457extern Bool VG_(is_kerror) ( Int res );
1458
sewardj2e93c502002-04-12 11:12:52 +00001459#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1460 VG_(load_thread_state)(thread_id); \
sewardjde4a1d02002-03-22 01:27:54 +00001461 VG_(copy_baseBlock_to_m_state_static)(); \
1462 VG_(do_syscall)(); \
1463 VG_(copy_m_state_static_to_baseBlock)(); \
sewardj2e93c502002-04-12 11:12:52 +00001464 VG_(save_thread_state)(thread_id); \
1465 result_lvalue = VG_(get_thread_state)(thread_id)->m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001466
1467
1468/* ---------------------------------------------------------------------
1469 Exports of vg_transtab.c
1470 ------------------------------------------------------------------ */
1471
1472/* An entry in the translation table (TT). */
1473typedef
1474 struct {
1475 /* +0 */ Addr orig_addr;
1476 /* +4 */ Addr trans_addr;
1477 /* +8 */ UInt mru_epoch;
1478 /* +12 */ UShort orig_size;
1479 /* +14 */ UShort trans_size;
1480 }
1481 TTEntry;
1482
1483/* The number of basic blocks in an epoch (one age-step). */
1484#define VG_BBS_PER_EPOCH 20000
1485
1486extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1487extern void VG_(maybe_do_lru_pass) ( void );
1488extern void VG_(flush_transtab) ( void );
1489extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1490extern void VG_(add_to_trans_tab) ( TTEntry* tte );
1491
1492extern void VG_(smc_mark_original) ( Addr original_addr,
1493 Int original_len );
1494
1495extern void VG_(init_transtab_and_SMC) ( void );
1496
1497extern void VG_(sanity_check_tc_tt) ( void );
1498extern Addr VG_(search_transtab) ( Addr original_addr );
1499
1500extern void VG_(invalidate_tt_fast)( void );
1501
1502
1503/* ---------------------------------------------------------------------
1504 Exports of vg_vtagops.c
1505 ------------------------------------------------------------------ */
1506
1507/* Lists the names of value-tag operations used in instrumented
1508 code. These are the third argument to TAG1 and TAG2 uinsns. */
1509
1510typedef
1511 enum {
1512 /* Unary. */
1513 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1514 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1515
1516 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1517
1518 VgT_Left4, VgT_Left2, VgT_Left1,
1519
1520 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1521 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1522
1523 /* Binary; 1st is rd; 2nd is rd+wr */
1524 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1525 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1526
1527 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1528 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1529 VgT_DebugFn
1530 }
1531 VgTagOp;
1532
1533extern Char* VG_(nameOfTagOp) ( VgTagOp );
1534extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1535
1536
1537/* ---------------------------------------------------------------------
1538 Exports of vg_syscall.S
1539 ------------------------------------------------------------------ */
1540
1541extern void VG_(do_syscall) ( void );
1542
1543
1544/* ---------------------------------------------------------------------
1545 Exports of vg_startup.S
1546 ------------------------------------------------------------------ */
1547
1548extern void VG_(shutdown);
1549extern void VG_(switch_to_real_CPU) ( void );
1550
sewardj35805422002-04-21 13:05:34 +00001551extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1552 Addr m_esp_at_error,
1553 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001554
1555
1556/* ---------------------------------------------------------------------
1557 Exports of vg_dispatch.S
1558 ------------------------------------------------------------------ */
1559
sewardj2e93c502002-04-12 11:12:52 +00001560/* Run a thread for a (very short) while, until some event happens
1561 which means we need to defer to the scheduler. */
1562extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001563
1564
1565/* ---------------------------------------------------------------------
1566 Exports of vg_helpers.S
1567 ------------------------------------------------------------------ */
1568
sewardjde4a1d02002-03-22 01:27:54 +00001569/* SMC fast checks. */
1570extern void VG_(helper_smc_check4);
1571
1572/* Mul, div, etc, -- we don't codegen these directly. */
1573extern void VG_(helper_idiv_64_32);
1574extern void VG_(helper_div_64_32);
1575extern void VG_(helper_idiv_32_16);
1576extern void VG_(helper_div_32_16);
1577extern void VG_(helper_idiv_16_8);
1578extern void VG_(helper_div_16_8);
1579
1580extern void VG_(helper_imul_32_64);
1581extern void VG_(helper_mul_32_64);
1582extern void VG_(helper_imul_16_32);
1583extern void VG_(helper_mul_16_32);
1584extern void VG_(helper_imul_8_16);
1585extern void VG_(helper_mul_8_16);
1586
1587extern void VG_(helper_CLD);
1588extern void VG_(helper_STD);
1589extern void VG_(helper_get_dirflag);
1590
1591extern void VG_(helper_shldl);
1592extern void VG_(helper_shldw);
1593extern void VG_(helper_shrdl);
1594extern void VG_(helper_shrdw);
1595
1596extern void VG_(helper_RDTSC);
1597extern void VG_(helper_CPUID);
1598
sewardjde4a1d02002-03-22 01:27:54 +00001599extern void VG_(helper_bsf);
1600extern void VG_(helper_bsr);
1601
1602extern void VG_(helper_fstsw_AX);
1603extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001604extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001605extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001606
1607extern void VG_(helper_value_check4_fail);
1608extern void VG_(helper_value_check2_fail);
1609extern void VG_(helper_value_check1_fail);
1610extern void VG_(helper_value_check0_fail);
1611
sewardjbc5b99f2002-04-13 00:08:51 +00001612/* NOT FUNCTIONS; these are bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001613extern void VG_(signalreturn_bogusRA)( void );
sewardjbc5b99f2002-04-13 00:08:51 +00001614extern void VG_(pthreadreturn_bogusRA)( void );
sewardj54cacf02002-04-12 23:24:59 +00001615
njn4f9c9342002-04-29 16:03:24 +00001616/* ---------------------------------------------------------------------
1617 Exports of vg_cachesim.c
1618 ------------------------------------------------------------------ */
1619
1620extern UCodeBlock* VG_(cachesim_instrument)(UCodeBlock* cb_in, Addr orig_addr);
1621
1622typedef struct _iCC iCC;
1623typedef struct _idCC idCC;
1624
1625extern void VG_(init_cachesim) ( void );
1626extern void VG_(show_cachesim_results)( Int client_argc, Char** client_argv );
1627
1628extern void VG_(cachesim_log_non_mem_instr)( iCC* cc );
1629extern void VG_(cachesim_log_mem_instr) ( idCC* cc, Addr data_addr );
sewardjde4a1d02002-03-22 01:27:54 +00001630
1631/* ---------------------------------------------------------------------
1632 The state of the simulated CPU.
1633 ------------------------------------------------------------------ */
1634
1635/* This is the Intel register encoding. */
1636#define R_EAX 0
1637#define R_ECX 1
1638#define R_EDX 2
1639#define R_EBX 3
1640#define R_ESP 4
1641#define R_EBP 5
1642#define R_ESI 6
1643#define R_EDI 7
1644
1645#define R_AL (0+R_EAX)
1646#define R_CL (0+R_ECX)
1647#define R_DL (0+R_EDX)
1648#define R_BL (0+R_EBX)
1649#define R_AH (4+R_EAX)
1650#define R_CH (4+R_ECX)
1651#define R_DH (4+R_EDX)
1652#define R_BH (4+R_EBX)
1653
1654
1655/* ---------------------------------------------------------------------
1656 Offsets into baseBlock for everything which needs to referred to
1657 from generated code. The order of these decls does not imply
1658 what the order of the actual offsets is. The latter is important
1659 and is set up in vg_main.c.
1660 ------------------------------------------------------------------ */
1661
1662/* An array of words. In generated code, %ebp always points to the
1663 start of this array. Useful stuff, like the simulated CPU state,
1664 and the addresses of helper functions, can then be found by
1665 indexing off %ebp. The following declares variables which, at
1666 startup time, are given values denoting offsets into baseBlock.
1667 These offsets are in *words* from the start of baseBlock. */
1668
1669#define VG_BASEBLOCK_WORDS 200
1670
1671extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1672
1673
1674/* -----------------------------------------------------
1675 Read-write parts of baseBlock.
1676 -------------------------------------------------- */
1677
1678/* State of the simulated CPU. */
1679extern Int VGOFF_(m_eax);
1680extern Int VGOFF_(m_ecx);
1681extern Int VGOFF_(m_edx);
1682extern Int VGOFF_(m_ebx);
1683extern Int VGOFF_(m_esp);
1684extern Int VGOFF_(m_ebp);
1685extern Int VGOFF_(m_esi);
1686extern Int VGOFF_(m_edi);
1687extern Int VGOFF_(m_eflags);
1688extern Int VGOFF_(m_fpustate);
1689extern Int VGOFF_(m_eip);
1690
1691/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1692extern Int VGOFF_(spillslots);
1693
1694/* Records the valid bits for the 8 integer regs & flags reg. */
1695extern Int VGOFF_(sh_eax);
1696extern Int VGOFF_(sh_ecx);
1697extern Int VGOFF_(sh_edx);
1698extern Int VGOFF_(sh_ebx);
1699extern Int VGOFF_(sh_esp);
1700extern Int VGOFF_(sh_ebp);
1701extern Int VGOFF_(sh_esi);
1702extern Int VGOFF_(sh_edi);
1703extern Int VGOFF_(sh_eflags);
1704
1705
1706/* -----------------------------------------------------
1707 Read-only parts of baseBlock.
1708 -------------------------------------------------- */
1709
1710/* Offsets of addresses of helper functions. A "helper" function is
1711 one which is called from generated code. */
1712
1713extern Int VGOFF_(helper_idiv_64_32);
1714extern Int VGOFF_(helper_div_64_32);
1715extern Int VGOFF_(helper_idiv_32_16);
1716extern Int VGOFF_(helper_div_32_16);
1717extern Int VGOFF_(helper_idiv_16_8);
1718extern Int VGOFF_(helper_div_16_8);
1719
1720extern Int VGOFF_(helper_imul_32_64);
1721extern Int VGOFF_(helper_mul_32_64);
1722extern Int VGOFF_(helper_imul_16_32);
1723extern Int VGOFF_(helper_mul_16_32);
1724extern Int VGOFF_(helper_imul_8_16);
1725extern Int VGOFF_(helper_mul_8_16);
1726
1727extern Int VGOFF_(helper_CLD);
1728extern Int VGOFF_(helper_STD);
1729extern Int VGOFF_(helper_get_dirflag);
1730
1731extern Int VGOFF_(helper_shldl);
1732extern Int VGOFF_(helper_shldw);
1733extern Int VGOFF_(helper_shrdl);
1734extern Int VGOFF_(helper_shrdw);
1735
1736extern Int VGOFF_(helper_RDTSC);
1737extern Int VGOFF_(helper_CPUID);
1738
sewardjde4a1d02002-03-22 01:27:54 +00001739extern Int VGOFF_(helper_bsf);
1740extern Int VGOFF_(helper_bsr);
1741
1742extern Int VGOFF_(helper_fstsw_AX);
1743extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001744extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001745extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001746
1747extern Int VGOFF_(helper_value_check4_fail);
1748extern Int VGOFF_(helper_value_check2_fail);
1749extern Int VGOFF_(helper_value_check1_fail);
1750extern Int VGOFF_(helper_value_check0_fail);
1751
sewardjde4a1d02002-03-22 01:27:54 +00001752extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1753extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1754extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1755
1756extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1757extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1758extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1759
1760extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1761extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1762extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1763
njn4f9c9342002-04-29 16:03:24 +00001764extern Int VGOFF_(cachesim_log_non_mem_instr);
1765extern Int VGOFF_(cachesim_log_mem_instr);
sewardjde4a1d02002-03-22 01:27:54 +00001766
1767#endif /* ndef __VG_INCLUDE_H */
1768
sewardj3b2736a2002-03-24 12:18:35 +00001769
1770/* ---------------------------------------------------------------------
1771 Finally - autoconf-generated settings
1772 ------------------------------------------------------------------ */
1773
1774#include "config.h"
1775
sewardjde4a1d02002-03-22 01:27:54 +00001776/*--------------------------------------------------------------------*/
1777/*--- end vg_include.h ---*/
1778/*--------------------------------------------------------------------*/