blob: 765d719f4f922535fd628f35b7e53a3bfa149449 [file] [log] [blame]
sewardjde4a1d02002-03-22 01:27:54 +00001
2/*--------------------------------------------------------------------*/
3/*--- A header file for all parts of Valgrind. ---*/
4/*--- Include no other! ---*/
5/*--- vg_include.h ---*/
6/*--------------------------------------------------------------------*/
7
8/*
9 This file is part of Valgrind, an x86 protected-mode emulator
10 designed for debugging and profiling binaries on x86-Unixes.
11
12 Copyright (C) 2000-2002 Julian Seward
13 jseward@acm.org
sewardjde4a1d02002-03-22 01:27:54 +000014
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License as
17 published by the Free Software Foundation; either version 2 of the
18 License, or (at your option) any later version.
19
20 This program is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with this program; if not, write to the Free Software
27 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28 02111-1307, USA.
29
30 The GNU General Public License is contained in the file LICENSE.
31*/
32
33#ifndef __VG_INCLUDE_H
34#define __VG_INCLUDE_H
35
36
37#include <stdarg.h> /* ANSI varargs stuff */
38#include <setjmp.h> /* for jmp_buf */
39
40
41/* ---------------------------------------------------------------------
42 Build options and table sizes. You should be able to change these
43 options or sizes, recompile, and still have a working system.
44 ------------------------------------------------------------------ */
45
46#include "vg_constants.h"
47
48
49/* Set to 1 to enable time profiling. Since this uses SIGPROF, we
50 don't want this permanently enabled -- only for profiling
51 builds. */
52#if 0
53# define VG_PROFILE
54#endif
55
56
57/* Total number of integer registers available for allocation. That's
58 all of them except %esp, %edi and %ebp. %edi is a general spare
59 temporary. %ebp permanently points at VG_(baseBlock). Note that
60 it's important that this tie in with what rankToRealRegNo() says.
61 DO NOT CHANGE THIS VALUE FROM 5. ! */
62#define VG_MAX_REALREGS 5
63
64/* Total number of spill slots available for allocation, if a TempReg
65 doesn't make it into a RealReg. Just bomb the entire system if
66 this value is too small; we don't expect it will ever get
67 particularly high. */
68#define VG_MAX_SPILLSLOTS 24
69
70
71/* Constants for the slow translation lookup cache. */
72#define VG_TRANSTAB_SLOW_BITS 11
73#define VG_TRANSTAB_SLOW_SIZE (1 << VG_TRANSTAB_SLOW_BITS)
74#define VG_TRANSTAB_SLOW_MASK ((VG_TRANSTAB_SLOW_SIZE) - 1)
75
76/* Size of a buffer used for creating messages. */
77#define M_VG_MSGBUF 10000
78
79/* Size of a smallish table used to read /proc/self/map entries. */
sewardjebc82332002-04-24 14:44:23 +000080#define M_PROCMAP_BUF 50000
sewardjde4a1d02002-03-22 01:27:54 +000081
82/* Max length of pathname to a .so/executable file. */
83#define M_VG_LIBNAMESTR 100
84
85/* Max length of a text fragment used to construct error messages. */
86#define M_VG_ERRTXT 512
87
88/* Max length of the string copied from env var VG_ARGS at startup. */
89#define M_VG_CMDLINE_STRLEN 1000
90
91/* Max number of options for Valgrind which we can handle. */
92#define M_VG_CMDLINE_OPTS 100
93
94/* After this many different unsuppressed errors have been observed,
95 be more conservative about collecting new ones. */
96#define M_VG_COLLECT_ERRORS_SLOWLY_AFTER 50
97
98/* After this many different unsuppressed errors have been observed,
99 stop collecting errors at all, and tell the user their program is
100 evidently a steaming pile of camel dung. */
sewardj1bebcbf2002-04-24 21:24:18 +0000101#define M_VG_COLLECT_NO_ERRORS_AFTER_SHOWN 300
sewardjf2537be2002-04-24 21:03:47 +0000102
103/* After this many total errors have been observed, stop collecting
104 errors at all. Counterpart to M_VG_COLLECT_NO_ERRORS_AFTER_SHOWN. */
sewardj1bebcbf2002-04-24 21:24:18 +0000105#define M_VG_COLLECT_NO_ERRORS_AFTER_FOUND 30000
sewardjde4a1d02002-03-22 01:27:54 +0000106
107/* These many bytes below %ESP are considered addressible if we're
108 doing the --workaround-gcc296-bugs hack. */
sewardjb581a132002-05-08 00:32:50 +0000109#define VG_GCC296_BUG_STACK_SLOP 1024
sewardjde4a1d02002-03-22 01:27:54 +0000110
111/* The maximum number of calls we're prepared to save in a
112 backtrace. */
113#define VG_DEEPEST_BACKTRACE 50
114
115/* Number of lists in which we keep track of malloc'd but not free'd
116 blocks. Should be prime. */
117#define VG_N_MALLOCLISTS 997
118
119/* Number of lists in which we keep track of ExeContexts. Should be
120 prime. */
121#define VG_N_EC_LISTS /*997*/ 4999
122
sewardj2e93c502002-04-12 11:12:52 +0000123/* Defines the thread-scheduling timeslice, in terms of the number of
124 basic blocks we attempt to run each thread for. Smaller values
125 give finer interleaving but much increased scheduling overheads. */
sewardjd8091eb2002-04-24 02:19:36 +0000126#define VG_SCHEDULING_QUANTUM 20000
sewardj2e93c502002-04-12 11:12:52 +0000127
128/* The maximum number of pthreads that we support. This is
129 deliberately not very high since our implementation of some of the
sewardj5f07b662002-04-23 16:52:51 +0000130 scheduler algorithms is surely O(N) in the number of threads, since
131 that's simple, at least. And (in practice) we hope that most
sewardj2e93c502002-04-12 11:12:52 +0000132 programs do not need many threads. */
sewardjebc82332002-04-24 14:44:23 +0000133#define VG_N_THREADS 50
sewardj5f07b662002-04-23 16:52:51 +0000134
135/* Maximum number of pthread keys available. Again, we start low until
136 the need for a higher number presents itself. */
137#define VG_N_THREAD_KEYS 10
sewardj2e93c502002-04-12 11:12:52 +0000138
139/* Number of file descriptors that can simultaneously be waited on for
140 I/O to complete. Perhaps this should be the same as VG_N_THREADS
141 (surely a thread can't wait on more than one fd at once?. Who
142 knows.) */
143#define VG_N_WAITING_FDS 10
144
sewardjbf290b92002-05-01 02:28:01 +0000145/* Stack size for a thread. We try and check that they do not go
146 beyond it. */
147#define VG_PTHREAD_STACK_SIZE 65536
148
sewardjde4a1d02002-03-22 01:27:54 +0000149
150/* ---------------------------------------------------------------------
151 Basic types
152 ------------------------------------------------------------------ */
153
154typedef unsigned char UChar;
155typedef unsigned short UShort;
156typedef unsigned int UInt;
157typedef unsigned long long int ULong;
158
159typedef signed char Char;
160typedef signed short Short;
161typedef signed int Int;
162typedef signed long long int Long;
163
164typedef unsigned int Addr;
165
166typedef unsigned char Bool;
167#define False ((Bool)0)
168#define True ((Bool)1)
169
170#define mycat_wrk(aaa,bbb) aaa##bbb
171#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
172
173/* Just pray that gcc's constant folding works properly ... */
174#define BITS(bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0) \
175 ( ((bit7) << 7) | ((bit6) << 6) | ((bit5) << 5) | ((bit4) << 4) \
176 | ((bit3) << 3) | ((bit2) << 2) | ((bit1) << 1) | (bit0))
177
178
179/* ---------------------------------------------------------------------
180 Now the basic types are set up, we can haul in the kernel-interface
181 definitions.
182 ------------------------------------------------------------------ */
183
184#include "./vg_kerneliface.h"
185
186
187/* ---------------------------------------------------------------------
188 Command-line-settable options
189 ------------------------------------------------------------------ */
190
191#define VG_CLO_SMC_NONE 0
192#define VG_CLO_SMC_SOME 1
193#define VG_CLO_SMC_ALL 2
194
195#define VG_CLO_MAX_SFILES 10
196
sewardj97ced732002-03-25 00:07:36 +0000197/* Shall we V-check addrs (they are always A checked too): default: YES */
198extern Bool VG_(clo_check_addrVs);
sewardjde4a1d02002-03-22 01:27:54 +0000199/* Enquire about whether to attach to GDB at errors? default: NO */
200extern Bool VG_(clo_GDB_attach);
201/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
202extern Int VG_(sanity_level);
203/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
204extern Int VG_(clo_verbosity);
205/* Automatically attempt to demangle C++ names? default: YES */
206extern Bool VG_(clo_demangle);
207/* Do leak check at exit? default: NO */
208extern Bool VG_(clo_leak_check);
209/* In leak check, show reachable-but-not-freed blocks? default: NO */
210extern Bool VG_(clo_show_reachable);
211/* How closely should we compare ExeContexts in leak records? default: 2 */
212extern Int VG_(clo_leak_resolution);
213/* Round malloc sizes upwards to integral number of words? default:
214 NO */
215extern Bool VG_(clo_sloppy_malloc);
216/* Allow loads from partially-valid addresses? default: YES */
217extern Bool VG_(clo_partial_loads_ok);
218/* Simulate child processes? default: NO */
219extern Bool VG_(clo_trace_children);
220/* The file id on which we send all messages. default: 2 (stderr). */
221extern Int VG_(clo_logfile_fd);
222/* Max volume of the freed blocks queue. */
223extern Int VG_(clo_freelist_vol);
224/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
225 default: NO */
226extern Bool VG_(clo_workaround_gcc296_bugs);
227
228/* The number of suppression files specified. */
229extern Int VG_(clo_n_suppressions);
230/* The names of the suppression files. */
231extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
232
233/* Single stepping? default: NO */
234extern Bool VG_(clo_single_step);
235/* Code improvement? default: YES */
236extern Bool VG_(clo_optimise);
237/* Memory-check instrumentation? default: YES */
238extern Bool VG_(clo_instrument);
239/* DEBUG: clean up instrumented code? default: YES */
240extern Bool VG_(clo_cleanup);
njn4f9c9342002-04-29 16:03:24 +0000241/* Cache simulation instrumentation? default: NO */
242extern Bool VG_(clo_cachesim);
sewardjde4a1d02002-03-22 01:27:54 +0000243/* SMC write checks? default: SOME (1,2,4 byte movs to mem) */
244extern Int VG_(clo_smc_check);
245/* DEBUG: print system calls? default: NO */
246extern Bool VG_(clo_trace_syscalls);
247/* DEBUG: print signal details? default: NO */
248extern Bool VG_(clo_trace_signals);
249/* DEBUG: print symtab details? default: NO */
250extern Bool VG_(clo_trace_symtab);
251/* DEBUG: print malloc details? default: NO */
252extern Bool VG_(clo_trace_malloc);
sewardj8937c812002-04-12 20:12:20 +0000253/* DEBUG: print thread scheduling events? default: NO */
254extern Bool VG_(clo_trace_sched);
sewardj45b4b372002-04-16 22:50:32 +0000255/* DEBUG: print pthread (mutex etc) events? default: 0 (none), 1
256 (some), 2 (all) */
257extern Int VG_(clo_trace_pthread_level);
sewardjde4a1d02002-03-22 01:27:54 +0000258/* Stop after this many basic blocks. default: Infinity. */
259extern ULong VG_(clo_stop_after);
260/* Display gory details for the k'th most popular error. default:
261 Infinity. */
262extern Int VG_(clo_dump_error);
263/* Number of parents of a backtrace. Default: 8. */
264extern Int VG_(clo_backtrace_size);
sewardj3984b852002-05-12 03:00:17 +0000265/* Engage miscellaneous wierd hacks needed for some progs. */
sewardj8d365b52002-05-12 10:52:16 +0000266extern Char* VG_(clo_weird_hacks);
sewardjde4a1d02002-03-22 01:27:54 +0000267
268
269/* ---------------------------------------------------------------------
270 Debugging and profiling stuff
271 ------------------------------------------------------------------ */
272
273/* No, really. I _am_ that strange. */
274#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
275
276/* Tools for building messages from multiple parts. */
277typedef
278 enum { Vg_UserMsg, Vg_DebugMsg, Vg_DebugExtraMsg }
279 VgMsgKind;
280
281extern void VG_(start_msg) ( VgMsgKind kind );
282extern void VG_(add_to_msg) ( Char* format, ... );
283extern void VG_(end_msg) ( void );
284
285/* Send a simple, single-part message. */
286extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
287
288/* Create a logfile into which messages can be dumped. */
289extern void VG_(startup_logging) ( void );
290extern void VG_(shutdown_logging) ( void );
291
292
293/* Profiling stuff */
294#ifdef VG_PROFILE
295
296#define VGP_M_STACK 10
297
sewardj671ff542002-05-07 09:25:30 +0000298#define VGP_M_CCS 26 /* == the # of elems in VGP_LIST */
sewardjde4a1d02002-03-22 01:27:54 +0000299#define VGP_LIST \
sewardj671ff542002-05-07 09:25:30 +0000300 VGP_PAIR(VgpUnc=0, "unclassified"), \
301 VGP_PAIR(VgpRun, "running"), \
302 VGP_PAIR(VgpSched, "scheduler"), \
sewardjde4a1d02002-03-22 01:27:54 +0000303 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
304 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
305 VGP_PAIR(VgpTranslate, "translate-main"), \
306 VGP_PAIR(VgpToUCode, "to-ucode"), \
307 VGP_PAIR(VgpFromUcode, "from-ucode"), \
308 VGP_PAIR(VgpImprove, "improve"), \
309 VGP_PAIR(VgpInstrument, "instrument"), \
310 VGP_PAIR(VgpCleanup, "cleanup"), \
311 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
312 VGP_PAIR(VgpDoLRU, "do-lru"), \
313 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
314 VGP_PAIR(VgpInitAudit, "init-mem-audit"), \
315 VGP_PAIR(VgpExeContext, "exe-context"), \
316 VGP_PAIR(VgpReadSyms, "read-syms"), \
317 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
318 VGP_PAIR(VgpSARP, "set-addr-range-perms"), \
319 VGP_PAIR(VgpSyscall, "syscall wrapper"), \
njn4f9c9342002-04-29 16:03:24 +0000320 VGP_PAIR(VgpCacheInstrument, "cache instrument"), \
321 VGP_PAIR(VgpCacheGetBBCC,"cache get BBCC"), \
322 VGP_PAIR(VgpCacheSimulate, "cache simulate"), \
323 VGP_PAIR(VgpCacheDump, "cache stats dump"), \
sewardjde4a1d02002-03-22 01:27:54 +0000324 VGP_PAIR(VgpSpare1, "spare 1"), \
325 VGP_PAIR(VgpSpare2, "spare 2")
326
327#define VGP_PAIR(enumname,str) enumname
328typedef enum { VGP_LIST } VgpCC;
329#undef VGP_PAIR
330
331extern void VGP_(init_profiling) ( void );
332extern void VGP_(done_profiling) ( void );
333extern void VGP_(pushcc) ( VgpCC );
334extern void VGP_(popcc) ( void );
335
336#define VGP_PUSHCC(cc) VGP_(pushcc)(cc)
337#define VGP_POPCC VGP_(popcc)()
338
339#else
340
341#define VGP_PUSHCC(cc) /* */
342#define VGP_POPCC /* */
343
344#endif /* VG_PROFILE */
345
346
347/* ---------------------------------------------------------------------
348 Exports of vg_malloc2.c
349 ------------------------------------------------------------------ */
350
351/* Allocation arenas.
352 SYMTAB is for Valgrind's symbol table storage.
353 CLIENT is for the client's mallocs/frees.
354 DEMANGLE is for the C++ demangler.
355 EXECTXT is for storing ExeContexts.
356 ERRCTXT is for storing ErrContexts.
357 PRIVATE is for Valgrind general stuff.
358 TRANSIENT is for very short-term use. It should be empty
359 in between uses.
360 When adding a new arena, remember also to add it
361 to ensure_mm_init().
362*/
363typedef Int ArenaId;
364
365#define VG_N_ARENAS 7
366
367#define VG_AR_PRIVATE 0 /* :: ArenaId */
368#define VG_AR_SYMTAB 1 /* :: ArenaId */
369#define VG_AR_CLIENT 2 /* :: ArenaId */
370#define VG_AR_DEMANGLE 3 /* :: ArenaId */
371#define VG_AR_EXECTXT 4 /* :: ArenaId */
372#define VG_AR_ERRCTXT 5 /* :: ArenaId */
373#define VG_AR_TRANSIENT 6 /* :: ArenaId */
374
375extern void* VG_(malloc) ( ArenaId arena, Int nbytes );
376extern void VG_(free) ( ArenaId arena, void* ptr );
377extern void* VG_(calloc) ( ArenaId arena, Int nmemb, Int nbytes );
378extern void* VG_(realloc) ( ArenaId arena, void* ptr, Int size );
379extern void* VG_(malloc_aligned) ( ArenaId aid, Int req_alignB,
380 Int req_pszB );
381
382extern void VG_(mallocSanityCheckArena) ( ArenaId arena );
383extern void VG_(mallocSanityCheckAll) ( void );
384
385extern void VG_(show_all_arena_stats) ( void );
386extern Bool VG_(is_empty_arena) ( ArenaId aid );
387
388
389/* The red-zone size for the client. This can be arbitrary, but
390 unfortunately must be set at compile time. */
391#define VG_AR_CLIENT_REDZONE_SZW 4
392
393#define VG_AR_CLIENT_REDZONE_SZB \
394 (VG_AR_CLIENT_REDZONE_SZW * VKI_BYTES_PER_WORD)
395
396
397/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000398 Exports of vg_clientfuns.c
399 ------------------------------------------------------------------ */
400
401/* This doesn't export code or data that valgrind.so needs to link
402 against. However, the scheduler does need to know the following
403 request codes. A few, publically-visible, request codes are also
404 defined in valgrind.h. */
405
406#define VG_USERREQ__MALLOC 0x2001
407#define VG_USERREQ__BUILTIN_NEW 0x2002
408#define VG_USERREQ__BUILTIN_VEC_NEW 0x2003
409
410#define VG_USERREQ__FREE 0x2004
411#define VG_USERREQ__BUILTIN_DELETE 0x2005
412#define VG_USERREQ__BUILTIN_VEC_DELETE 0x2006
413
414#define VG_USERREQ__CALLOC 0x2007
415#define VG_USERREQ__REALLOC 0x2008
416#define VG_USERREQ__MEMALIGN 0x2009
417
418
419#define VG_USERREQ__PTHREAD_CREATE 0x3001
sewardjbc5b99f2002-04-13 00:08:51 +0000420#define VG_USERREQ__PTHREAD_JOIN 0x3002
421#define VG_USERREQ__PTHREAD_GET_THREADID 0x3003
sewardj3b5d8862002-04-20 13:53:23 +0000422#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x3004
sewardj30671ff2002-04-21 00:13:57 +0000423#define VG_USERREQ__PTHREAD_MUTEX_TRYLOCK 0x3005
424#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x3006
425#define VG_USERREQ__PTHREAD_CANCEL 0x3007
426#define VG_USERREQ__PTHREAD_EXIT 0x3008
427#define VG_USERREQ__PTHREAD_COND_WAIT 0x3009
sewardj5f07b662002-04-23 16:52:51 +0000428#define VG_USERREQ__PTHREAD_COND_TIMEDWAIT 0x300A
429#define VG_USERREQ__PTHREAD_COND_SIGNAL 0x300B
430#define VG_USERREQ__PTHREAD_COND_BROADCAST 0x300C
431#define VG_USERREQ__PTHREAD_KEY_CREATE 0x300D
432#define VG_USERREQ__PTHREAD_KEY_DELETE 0x300E
433#define VG_USERREQ__PTHREAD_SETSPECIFIC 0x300F
434#define VG_USERREQ__PTHREAD_GETSPECIFIC 0x3010
sewardj56fc53d2002-04-24 01:17:42 +0000435#define VG_USERREQ__READ_MILLISECOND_TIMER 0x3011
sewardj2e93c502002-04-12 11:12:52 +0000436
sewardj45b4b372002-04-16 22:50:32 +0000437/* Cosmetic ... */
438#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
439
sewardj54cacf02002-04-12 23:24:59 +0000440/*
441In vg_constants.h:
442#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardjbc5b99f2002-04-13 00:08:51 +0000443#define VG_USERREQ__PTHREAD_RETURNS 0x4002
sewardj54cacf02002-04-12 23:24:59 +0000444*/
445
446
sewardj2e93c502002-04-12 11:12:52 +0000447/* ---------------------------------------------------------------------
448 Constants pertaining to the simulated CPU state, VG_(baseBlock),
449 which need to go here to avoid ugly circularities.
450 ------------------------------------------------------------------ */
451
452/* How big is the saved FPU state? */
453#define VG_SIZE_OF_FPUSTATE 108
454/* ... and in words ... */
455#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
456
457
458/* ---------------------------------------------------------------------
459 Exports of vg_scheduler.c
460 ------------------------------------------------------------------ */
461
462/* ThreadIds are simply indices into the vg_threads[] array. */
463typedef
464 UInt
465 ThreadId;
466
sewardj6072c362002-04-19 14:40:57 +0000467/* Special magic value for an invalid ThreadId. It corresponds to
468 LinuxThreads using zero as the initial value for
469 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
470#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000471
472typedef
473 enum {
474 VgTs_Empty, /* this slot is not in use */
475 VgTs_Runnable, /* waiting to be scheduled */
476 VgTs_WaitJoiner, /* waiting for someone to do join on me */
477 VgTs_WaitJoinee, /* waiting for the thread I did join on */
478 VgTs_WaitFD, /* waiting for I/O completion on a fd */
479 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000480 VgTs_WaitCV, /* waiting on a condition variable */
sewardj2e93c502002-04-12 11:12:52 +0000481 VgTs_Sleeping /* sleeping for a while */
482 }
483 ThreadStatus;
484
485typedef
486 struct {
sewardj6072c362002-04-19 14:40:57 +0000487 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
488 The thread identity is simply the index in vg_threads[].
489 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000490 that we don't try and allocate or deallocate its stack. For
491 convenience of generating error message, we also put the
492 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000493 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000494 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000495
sewardj5f07b662002-04-23 16:52:51 +0000496 /* Current scheduling status.
497
498 Complications: whenever this is set to VgTs_WaitMX, you
499 should also set .m_edx to whatever the required return value
500 is for pthread_mutex_lock / pthread_cond_timedwait for when
501 the mutex finally gets unblocked. */
sewardj2e93c502002-04-12 11:12:52 +0000502 ThreadStatus status;
503
504 /* Identity of joiner (thread who called join on me), or
505 VG_INVALID_THREADID if no one asked to join yet. */
506 ThreadId joiner;
507
sewardj3b5d8862002-04-20 13:53:23 +0000508 /* When .status == WaitMX, points to the mutex I am waiting for.
509 When .status == WaitCV, points to the mutex associated with
510 the condition variable indicated by the .associated_cv field.
511 In all other cases, should be NULL. */
512 void* /* pthread_mutex_t* */ associated_mx;
513
514 /* When .status == WaitCV, points to the condition variable I am
515 waiting for. In all other cases, should be NULL. */
516 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000517
sewardj5f07b662002-04-23 16:52:51 +0000518 /* If VgTs_Sleeping, this is when we should wake up, measured in
519 milliseconds as supplied by VG_(read_millisecond_counter).
520
521 If VgTs_WaitCV, this indicates the time at which
522 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
523 this means infinitely far in the future, viz,
524 pthread_cond_wait. */
525 UInt awaken_at;
sewardj2e93c502002-04-12 11:12:52 +0000526
527 /* return value */
528 void* retval;
529
sewardj5f07b662002-04-23 16:52:51 +0000530 /* thread-specific data */
531 void* specifics[VG_N_THREAD_KEYS];
532
sewardj2e93c502002-04-12 11:12:52 +0000533 /* Stacks. When a thread slot is freed, we don't deallocate its
534 stack; we just leave it lying around for the next use of the
535 slot. If the next use of the slot requires a larger stack,
536 only then is the old one deallocated and a new one
537 allocated.
538
539 For the main thread (threadid == 0), this mechanism doesn't
540 apply. We don't know the size of the stack since we didn't
541 allocate it, and furthermore we never reallocate it. */
542
543 /* The allocated size of this thread's stack (permanently zero
544 if this is ThreadId == 0, since we didn't allocate its stack) */
545 UInt stack_size;
546
547 /* Address of the lowest word in this thread's stack. NULL means
548 not allocated yet.
549 */
550 Addr stack_base;
551
sewardj1e8cdc92002-04-18 11:37:52 +0000552 /* Address of the highest legitimate word in this stack. This is
553 used for error messages only -- not critical for execution
554 correctness. Is is set for all stacks, specifically including
555 ThreadId == 0 (the main thread). */
556 Addr stack_highest_word;
557
sewardj2e93c502002-04-12 11:12:52 +0000558 /* Saved machine context. */
559 UInt m_eax;
560 UInt m_ebx;
561 UInt m_ecx;
562 UInt m_edx;
563 UInt m_esi;
564 UInt m_edi;
565 UInt m_ebp;
566 UInt m_esp;
567 UInt m_eflags;
568 UInt m_eip;
569 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
570
571 UInt sh_eax;
572 UInt sh_ebx;
573 UInt sh_ecx;
574 UInt sh_edx;
575 UInt sh_esi;
576 UInt sh_edi;
577 UInt sh_ebp;
578 UInt sh_esp;
579 UInt sh_eflags;
580 }
581 ThreadState;
582
583
584/* Copy the specified thread's state into VG_(baseBlock) in
585 preparation for running it. */
586extern void VG_(load_thread_state)( ThreadId );
587
588/* Save the specified thread's state back in VG_(baseBlock), and fill
589 VG_(baseBlock) with junk, for sanity-check reasons. */
590extern void VG_(save_thread_state)( ThreadId );
591
592/* Get the thread state block for the specified thread. */
593extern ThreadState* VG_(get_thread_state)( ThreadId );
594
sewardj1e8cdc92002-04-18 11:37:52 +0000595/* And for the currently running one, if valid. */
596extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000597
sewardj1e8cdc92002-04-18 11:37:52 +0000598/* Similarly ... */
599extern ThreadId VG_(get_current_tid) ( void );
600
601/* Which thread is this address in the stack of, if any? Used for
602 error message generation. */
603extern ThreadId VG_(identify_stack_addr)( Addr a );
604
sewardj2e93c502002-04-12 11:12:52 +0000605
606/* Return codes from the scheduler. */
607typedef
sewardj7e87e382002-05-03 19:09:05 +0000608 enum {
609 VgSrc_Deadlock, /* no runnable threads and no prospect of any
610 even if we wait for a long time */
611 VgSrc_ExitSyscall, /* client called exit(). This is the normal
612 route out. */
613 VgSrc_BbsDone /* In a debugging run, the specified number of
614 bbs has been completed. */
615 }
sewardj2e93c502002-04-12 11:12:52 +0000616 VgSchedReturnCode;
617
sewardj7e87e382002-05-03 19:09:05 +0000618
sewardj2e93c502002-04-12 11:12:52 +0000619/* The scheduler. */
620extern VgSchedReturnCode VG_(scheduler) ( void );
621
622extern void VG_(scheduler_init) ( void );
623
sewardj15a43e12002-04-17 19:35:12 +0000624extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000625
626/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
627extern jmp_buf VG_(scheduler_jmpbuf);
628/* ... and if so, here's the signal which caused it to do so. */
629extern Int VG_(longjmpd_on_signal);
630
631
sewardja1679dd2002-05-10 22:31:40 +0000632/* Possible places where the main stack might be based. We check that
633 the initial stack, which we can't move, is allocated here.
634 VG_(scheduler_init) checks this. Andrea Archelangi's 2.4 kernels
635 have been rumoured to start stacks at 0x80000000, so that too is
636 considered.
sewardj2e93c502002-04-12 11:12:52 +0000637*/
sewardja1679dd2002-05-10 22:31:40 +0000638#define VG_STARTUP_STACK_BASE_1 (Addr)0xC0000000
639#define VG_STARTUP_STACK_BASE_2 (Addr)0x80000000
640#define VG_STARTUP_STACK_SMALLERTHAN 0x100000 /* 1024k */
641
642#define VG_STACK_MATCHES_BASE(zzstack, zzbase) \
643 ( \
644 ((zzstack) & ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN)) \
645 == \
646 ((zzbase) - VG_STARTUP_STACK_SMALLERTHAN) \
647 )
sewardj2e93c502002-04-12 11:12:52 +0000648
649
650/* The red-zone size which we put at the bottom (highest address) of
651 thread stacks, for paranoia reasons. This can be arbitrary, and
652 doesn't really need to be set at compile time. */
653#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
654
655#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
656 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
657
658
659
660/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000661 Exports of vg_signals.c
662 ------------------------------------------------------------------ */
663
sewardjde4a1d02002-03-22 01:27:54 +0000664extern void VG_(sigstartup_actions) ( void );
665
sewardj14e03422002-04-24 19:51:31 +0000666extern Bool VG_(deliver_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000667extern void VG_(unblock_host_signal) ( Int sigNo );
668
669
670/* Fake system calls for signal handling. */
sewardj2e93c502002-04-12 11:12:52 +0000671extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000672extern void VG_(do__NR_sigprocmask) ( Int how, vki_ksigset_t* set );
673
sewardj2e93c502002-04-12 11:12:52 +0000674/* Modify the current thread's state once we have detected it is
675 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000676extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000677
sewardj2e93c502002-04-12 11:12:52 +0000678/* Handy utilities to block/restore all host signals. */
679extern void VG_(block_all_host_signals)
680 ( /* OUT */ vki_ksigset_t* saved_mask );
681extern void VG_(restore_host_signals)
682 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000683
684/* ---------------------------------------------------------------------
685 Exports of vg_mylibc.c
686 ------------------------------------------------------------------ */
687
688
sewardjfbe18b92002-05-10 00:46:59 +0000689#if !defined(NULL)
690# define NULL ((void*)0)
691#endif
sewardjde4a1d02002-03-22 01:27:54 +0000692
693extern void VG_(exit)( Int status )
694 __attribute__ ((__noreturn__));
695
696extern void VG_(printf) ( const char *format, ... );
697/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
698
699extern void VG_(sprintf) ( Char* buf, Char *format, ... );
700
701extern void VG_(vprintf) ( void(*send)(Char),
702 const Char *format, va_list vargs );
703
704extern Bool VG_(isspace) ( Char c );
705
706extern Int VG_(strlen) ( const Char* str );
707
708extern Long VG_(atoll) ( Char* str );
709
710extern Char* VG_(strcat) ( Char* dest, const Char* src );
711extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
712extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
713
714extern Char* VG_(strcpy) ( Char* dest, const Char* src );
715
716extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
717extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
718
719extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
720extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
721
722extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
723extern Char* VG_(strchr) ( const Char* s, Char c );
724extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
725
726extern Char* VG_(getenv) ( Char* name );
727extern Int VG_(getpid) ( void );
sewardj5f07b662002-04-23 16:52:51 +0000728
729extern void VG_(start_rdtsc_calibration) ( void );
730extern void VG_(end_rdtsc_calibration) ( void );
731extern UInt VG_(read_millisecond_timer) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000732
733
734extern Char VG_(toupper) ( Char c );
735
736extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
737
738extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
739
740extern Bool VG_(stringMatch) ( Char* pat, Char* str );
741
742
743#define __STRING(x) #x
744
745/* Asserts are permanently enabled. Hurrah! */
746#define vg_assert(expr) \
747 ((void) ((expr) ? 0 : \
748 (VG_(assert_fail) (__STRING(expr), \
749 __FILE__, __LINE__, \
750 __PRETTY_FUNCTION__), 0)))
751
752extern void VG_(assert_fail) ( Char* expr, Char* file,
753 Int line, Char* fn )
754 __attribute__ ((__noreturn__));
755
njn4f9c9342002-04-29 16:03:24 +0000756/* Reading and writing files. */
sewardjde4a1d02002-03-22 01:27:54 +0000757extern Int VG_(open_read) ( Char* pathname );
njn4f9c9342002-04-29 16:03:24 +0000758extern Int VG_(open_write) ( Char* pathname );
759extern Int VG_(create_and_write) ( Char* pathname );
sewardjde4a1d02002-03-22 01:27:54 +0000760extern void VG_(close) ( Int fd );
761extern Int VG_(read) ( Int fd, void* buf, Int count);
762extern Int VG_(write) ( Int fd, void* buf, Int count);
sewardjb3586202002-05-09 17:38:13 +0000763extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
sewardjde4a1d02002-03-22 01:27:54 +0000764
sewardj2e93c502002-04-12 11:12:52 +0000765extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
766
767extern Int VG_(select)( Int n,
768 vki_fd_set* readfds,
769 vki_fd_set* writefds,
770 vki_fd_set* exceptfds,
771 struct vki_timeval * timeout );
772extern Int VG_(nanosleep)( const struct vki_timespec *req,
773 struct vki_timespec *rem );
774
775
sewardjde4a1d02002-03-22 01:27:54 +0000776/* mmap-ery ... */
777extern void* VG_(mmap)( void* start, UInt length,
778 UInt prot, UInt flags, UInt fd, UInt offset );
779
sewardj2e93c502002-04-12 11:12:52 +0000780extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000781
sewardjb3586202002-05-09 17:38:13 +0000782extern void* VG_(brk) ( void* end_data_segment );
783
sewardjde4a1d02002-03-22 01:27:54 +0000784
785/* Print a (panic) message, and abort. */
786extern void VG_(panic) ( Char* str )
787 __attribute__ ((__noreturn__));
788
789/* Get memory by anonymous mmap. */
sewardje6a25242002-04-21 22:03:07 +0000790extern void* VG_(get_memory_from_mmap) ( Int nBytes );
791
792/* Crude stand-in for the glibc system() call. */
793extern Int VG_(system) ( Char* cmd );
794
sewardjde4a1d02002-03-22 01:27:54 +0000795
796/* Signal stuff. Note that these use the vk_ (kernel) structure
797 definitions, which are different in places from those that glibc
798 defines. Since we're operating right at the kernel interface,
799 glibc's view of the world is entirely irrelevant. */
800extern Int VG_(ksigfillset)( vki_ksigset_t* set );
801extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
802extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
803
804extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
805 vki_ksigset_t* oldset );
806extern Int VG_(ksigaction) ( Int signum,
807 const vki_ksigaction* act,
808 vki_ksigaction* oldact );
809extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
810
811extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
812
813extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
814
815
816
817/* ---------------------------------------------------------------------
818 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
819 vg_from_ucode.c).
820 ------------------------------------------------------------------ */
821
822/* Tags which describe what operands are. */
823typedef
824 enum { TempReg=0, ArchReg=1, RealReg=2,
825 SpillNo=3, Literal=4, Lit16=5,
826 NoValue=6 }
827 Tag;
828
829
830/* Microinstruction opcodes. */
831typedef
832 enum {
833 NOP,
834 GET,
835 PUT,
836 LOAD,
837 STORE,
838 MOV,
839 CMOV, /* Used for cmpxchg and cmov */
840 WIDEN,
841 JMP,
842
843 /* Read/write the %EFLAGS register into a TempReg. */
844 GETF, PUTF,
845
846 ADD, ADC, AND, OR, XOR, SUB, SBB,
847 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
848 NOT, NEG, INC, DEC, BSWAP,
849 CC2VAL,
850
851 /* Not strictly needed, but useful for making better
852 translations of address calculations. */
853 LEA1, /* reg2 := const + reg1 */
854 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
855
856 /* not for translating x86 calls -- only to call helpers */
857 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
858 for CALLM. */
859 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
860 CALLM, /* call to a machine-code helper */
861
862 /* Hack for translating string (REP-) insns. Jump to literal if
863 TempReg/RealReg is zero. */
864 JIFZ,
865
866 /* FPU ops which read/write mem or don't touch mem at all. */
867 FPU_R,
868 FPU_W,
869 FPU,
870
871 /* Advance the simulated %eip by some small (< 128) number. */
872 INCEIP,
873
874 /* uinstrs which are not needed for mere translation of x86 code,
875 only for instrumentation of it. */
876 LOADV,
877 STOREV,
878 GETV,
879 PUTV,
880 TESTV,
881 SETV,
882 /* Get/set the v-bit (and it is only one bit) for the simulated
883 %eflags register. */
884 GETVF,
885 PUTVF,
886
887 /* Do a unary or binary tag op. Only for post-instrumented
888 code. For TAG1, first and only arg is a TempReg, and is both
889 arg and result reg. For TAG2, first arg is src, second is
890 dst, in the normal way; both are TempRegs. In both cases,
891 3rd arg is a RiCHelper with a Lit16 tag. This indicates
892 which tag op to do. */
893 TAG1,
894 TAG2
895 }
896 Opcode;
897
898
899/* Condition codes, observing the Intel encoding. CondAlways is an
900 extra. */
901typedef
902 enum {
903 CondO = 0, /* overflow */
904 CondNO = 1, /* no overflow */
905 CondB = 2, /* below */
906 CondNB = 3, /* not below */
907 CondZ = 4, /* zero */
908 CondNZ = 5, /* not zero */
909 CondBE = 6, /* below or equal */
910 CondNBE = 7, /* not below or equal */
911 CondS = 8, /* negative */
912 ConsNS = 9, /* not negative */
913 CondP = 10, /* parity even */
914 CondNP = 11, /* not parity even */
915 CondL = 12, /* jump less */
916 CondNL = 13, /* not less */
917 CondLE = 14, /* less or equal */
918 CondNLE = 15, /* not less or equal */
919 CondAlways = 16 /* Jump always */
920 }
921 Condcode;
922
923
sewardj2e93c502002-04-12 11:12:52 +0000924/* Descriptions of additional properties of *unconditional* jumps. */
925typedef
926 enum {
927 JmpBoring=0, /* boring unconditional jump */
928 JmpCall=1, /* jump due to an x86 call insn */
929 JmpRet=2, /* jump due to an x86 ret insn */
930 JmpSyscall=3, /* do a system call, then jump */
931 JmpClientReq=4 /* do a client request, then jump */
932 }
933 JmpKind;
934
935
sewardjde4a1d02002-03-22 01:27:54 +0000936/* Flags. User-level code can only read/write O(verflow), S(ign),
937 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
938 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
939 thusly:
940 76543210
941 DOSZACP
942 and bit 7 must always be zero since it is unused.
943*/
944typedef UChar FlagSet;
945
946#define FlagD (1<<6)
947#define FlagO (1<<5)
948#define FlagS (1<<4)
949#define FlagZ (1<<3)
950#define FlagA (1<<2)
951#define FlagC (1<<1)
952#define FlagP (1<<0)
953
954#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
955#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
956#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
957#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
958#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
959#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +0000960#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +0000961#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +0000962#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +0000963
964#define FlagsALL (FlagsOSZACP | FlagD)
965#define FlagsEmpty (FlagSet)0
966
967#define VG_IS_FLAG_SUBSET(set1,set2) \
968 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
969
970#define VG_UNION_FLAG_SETS(set1,set2) \
971 ( ((FlagSet)set1) | ((FlagSet)set2) )
972
973
974
975/* A Micro (u)-instruction. */
976typedef
977 struct {
978 /* word 1 */
979 UInt lit32; /* 32-bit literal */
980
981 /* word 2 */
982 UShort val1; /* first operand */
983 UShort val2; /* second operand */
984
985 /* word 3 */
986 UShort val3; /* third operand */
987 UChar opcode; /* opcode */
988 UChar size; /* data transfer size */
989
990 /* word 4 */
991 FlagSet flags_r; /* :: FlagSet */
992 FlagSet flags_w; /* :: FlagSet */
993 UChar tag1:4; /* first operand tag */
994 UChar tag2:4; /* second operand tag */
995 UChar tag3:4; /* third operand tag */
996 UChar extra4b:4; /* Spare field, used by WIDEN for src
997 -size, and by LEA2 for scale
njn4f9c9342002-04-29 16:03:24 +0000998 (1,2,4 or 8), and by unconditional JMPs for
999 orig x86 instr size if --cachesim=yes */
1000
sewardjde4a1d02002-03-22 01:27:54 +00001001
1002 /* word 5 */
1003 UChar cond; /* condition, for jumps */
1004 Bool smc_check:1; /* do a smc test, if writes memory. */
1005 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +00001006 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +00001007 }
1008 UInstr;
1009
1010
1011/* Expandable arrays of uinstrs. */
1012typedef
1013 struct {
1014 Int used;
1015 Int size;
1016 UInstr* instrs;
1017 Int nextTemp;
1018 }
1019 UCodeBlock;
1020
1021/* Refer to `the last instruction stuffed in', including as an
1022 lvalue. */
1023#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1024
1025/* An invalid temporary number :-) */
1026#define INVALID_TEMPREG 999999999
1027
1028
1029/* ---------------------------------------------------------------------
1030 Exports of vg_demangle.c
1031 ------------------------------------------------------------------ */
1032
1033extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
1034
1035
1036/* ---------------------------------------------------------------------
1037 Exports of vg_from_ucode.c
1038 ------------------------------------------------------------------ */
1039
1040extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
1041
1042
1043/* ---------------------------------------------------------------------
1044 Exports of vg_to_ucode.c
1045 ------------------------------------------------------------------ */
1046
1047extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
1048extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
1049extern Char VG_(nameOfIntSize) ( Int size );
1050extern UInt VG_(extend_s_8to32) ( UInt x );
1051extern Int VG_(getNewTemp) ( UCodeBlock* cb );
1052extern Int VG_(getNewShadow) ( UCodeBlock* cb );
1053
1054#define SHADOW(tempreg) ((tempreg)+1)
1055
1056
1057/* ---------------------------------------------------------------------
1058 Exports of vg_translate.c
1059 ------------------------------------------------------------------ */
1060
sewardj1e8cdc92002-04-18 11:37:52 +00001061extern void VG_(translate) ( ThreadState* tst,
1062 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001063 UInt* orig_size,
1064 Addr* trans_addr,
1065 UInt* trans_size );
1066
1067extern void VG_(emptyUInstr) ( UInstr* u );
1068extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1069extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
1070 Tag tag1, UInt val1 );
1071extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
1072 Tag tag1, UInt val1,
1073 Tag tag2, UInt val2 );
1074extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
1075 Tag tag1, UInt val1,
1076 Tag tag2, UInt val2,
1077 Tag tag3, UInt val3 );
1078extern void VG_(setFlagRW) ( UInstr* u,
1079 FlagSet fr, FlagSet fw );
1080
1081extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1082extern Bool VG_(anyFlagUse) ( UInstr* u );
1083
1084
1085
1086extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1087extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1088
njn4f9c9342002-04-29 16:03:24 +00001089extern UCodeBlock* VG_(allocCodeBlock) ( void );
1090extern void VG_(freeCodeBlock) ( UCodeBlock* cb );
1091extern void VG_(copyUInstr) ( UCodeBlock* cb, UInstr* instr );
1092
sewardjde4a1d02002-03-22 01:27:54 +00001093extern Char* VG_(nameCondcode) ( Condcode cond );
1094extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1095extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1096extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1097extern Int VG_(rankToRealRegNo) ( Int rank );
1098
1099extern void* VG_(jitmalloc) ( Int nbytes );
1100extern void VG_(jitfree) ( void* ptr );
1101
1102
1103/* ---------------------------------------------------------------------
1104 Exports of vg_execontext.c.
1105 ------------------------------------------------------------------ */
1106
1107/* Records the PC and a bit of the call chain. The first 4 %eip
1108 values are used in comparisons do remove duplicate errors, and for
1109 comparing against suppression specifications. The rest are purely
1110 informational (but often important). */
1111
1112typedef
1113 struct _ExeContextRec {
1114 struct _ExeContextRec * next;
1115 /* The size of this array is VG_(clo_backtrace_size); at least
1116 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1117 [1] is its caller, [2] is the caller of [1], etc. */
1118 Addr eips[0];
1119 }
1120 ExeContext;
1121
1122
1123/* Initialise the ExeContext storage mechanism. */
1124extern void VG_(init_ExeContext_storage) ( void );
1125
1126/* Print stats (informational only). */
1127extern void VG_(show_ExeContext_stats) ( void );
1128
1129
1130/* Take a snapshot of the client's stack. Search our collection of
1131 ExeContexts to see if we already have it, and if not, allocate a
1132 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001133extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1134 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001135
1136/* Print an ExeContext. */
1137extern void VG_(pp_ExeContext) ( ExeContext* );
1138
1139/* Compare two ExeContexts, just comparing the top two callers. */
1140extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1141
1142/* Compare two ExeContexts, just comparing the top four callers. */
1143extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1144
1145/* Compare two ExeContexts, comparing all callers. */
1146extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1147
1148
1149
1150/* ---------------------------------------------------------------------
1151 Exports of vg_errcontext.c.
1152 ------------------------------------------------------------------ */
1153
1154extern void VG_(load_suppressions) ( void );
1155extern void VG_(show_all_errors) ( void );
1156extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001157extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1158extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001159extern void VG_(record_address_error) ( Addr a, Int size,
1160 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001161
1162extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001163
1164extern void VG_(record_param_err) ( ThreadState* tst,
1165 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001166 Bool isWriteLack,
1167 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001168extern void VG_(record_user_err) ( ThreadState* tst,
1169 Addr a, Bool isWriteLack );
sewardjde4a1d02002-03-22 01:27:54 +00001170
1171
1172/* The classification of a faulting address. */
1173typedef
sewardjb581a132002-05-08 00:32:50 +00001174 enum { Undescribed, /* as-yet unclassified */
1175 Stack,
1176 Unknown, /* classification yielded nothing useful */
1177 Freed, Mallocd,
1178 UserG, UserS }
sewardjde4a1d02002-03-22 01:27:54 +00001179 AddrKind;
1180
1181/* Records info about a faulting address. */
1182typedef
1183 struct {
1184 /* ALL */
1185 AddrKind akind;
1186 /* Freed, Mallocd */
1187 Int blksize;
1188 /* Freed, Mallocd */
1189 Int rwoffset;
1190 /* Freed, Mallocd */
1191 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001192 /* Stack */
1193 ThreadId stack_tid;
sewardjb581a132002-05-08 00:32:50 +00001194 /* True if is just-below %esp -- could be a gcc bug. */
1195 Bool maybe_gcc;
sewardjde4a1d02002-03-22 01:27:54 +00001196 }
1197 AddrInfo;
1198
1199
1200/* ---------------------------------------------------------------------
1201 Exports of vg_clientperms.c
1202 ------------------------------------------------------------------ */
1203
1204extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1205
sewardj8c824512002-04-14 04:16:48 +00001206extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001207
1208extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1209
1210extern void VG_(show_client_block_stats) ( void );
1211
1212
1213/* ---------------------------------------------------------------------
1214 Exports of vg_procselfmaps.c
1215 ------------------------------------------------------------------ */
1216
1217extern
1218void VG_(read_procselfmaps) (
1219 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1220);
1221
1222
1223/* ---------------------------------------------------------------------
1224 Exports of vg_symtab2.c
1225 ------------------------------------------------------------------ */
1226
1227/* We assume the executable is loaded here ... can't really find
1228 out. There is a hacky sanity check in vg_init_memory_audit()
1229 which should trip up most stupidities.
1230*/
1231#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1232
1233extern void VG_(read_symbols) ( void );
1234extern void VG_(mini_stack_dump) ( ExeContext* ec );
1235extern void VG_(what_obj_and_fun_is_this)
1236 ( Addr a,
1237 Char* obj_buf, Int n_obj_buf,
1238 Char* fun_buf, Int n_fun_buf );
njn4f9c9342002-04-29 16:03:24 +00001239extern Bool VG_(what_line_is_this) ( Addr a,
1240 UChar* filename, Int n_filename,
1241 UInt* lineno );
1242extern Bool VG_(what_fn_is_this) ( Bool no_demangle, Addr a,
1243 Char* fn_name, Int n_fn_name);
sewardjde4a1d02002-03-22 01:27:54 +00001244
1245extern void VG_(symtab_notify_munmap) ( Addr start, UInt length );
1246
1247
1248/* ---------------------------------------------------------------------
1249 Exports of vg_clientmalloc.c
1250 ------------------------------------------------------------------ */
1251
sewardjde4a1d02002-03-22 01:27:54 +00001252typedef
1253 enum {
1254 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001255 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001256 Vg_AllocNewVec = 2
1257 }
1258 VgAllocKind;
1259
1260/* Description of a malloc'd chunk. */
1261typedef
1262 struct _ShadowChunk {
1263 struct _ShadowChunk* next;
1264 ExeContext* where; /* where malloc'd/free'd */
1265 UInt size : 30; /* size requested. */
1266 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1267 Addr data; /* ptr to actual block. */
1268 }
1269 ShadowChunk;
1270
1271extern void VG_(clientmalloc_done) ( void );
1272extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1273extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1274
sewardj2e93c502002-04-12 11:12:52 +00001275/* These are called from the scheduler, when it intercepts a user
1276 request. */
sewardj8c824512002-04-14 04:16:48 +00001277extern void* VG_(client_malloc) ( ThreadState* tst,
1278 UInt size, VgAllocKind kind );
1279extern void* VG_(client_memalign) ( ThreadState* tst,
1280 UInt align, UInt size );
1281extern void VG_(client_free) ( ThreadState* tst,
1282 void* ptrV, VgAllocKind kind );
1283extern void* VG_(client_calloc) ( ThreadState* tst,
1284 UInt nmemb, UInt size1 );
1285extern void* VG_(client_realloc) ( ThreadState* tst,
1286 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001287
1288
1289/* ---------------------------------------------------------------------
1290 Exports of vg_main.c
1291 ------------------------------------------------------------------ */
1292
sewardjde4a1d02002-03-22 01:27:54 +00001293/* A structure used as an intermediary when passing the simulated
1294 CPU's state to some assembly fragments, particularly system calls.
1295 Stuff is copied from baseBlock to here, the assembly magic runs,
1296 and then the inverse copy is done. */
1297
1298extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1299 + 1 /* %eflags */
1300 + 1 /* %eip */
1301 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1302 ];
1303
1304/* Handy fns for doing the copy back and forth. */
1305extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1306extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1307
sewardjde4a1d02002-03-22 01:27:54 +00001308/* Called when some unhandleable client behaviour is detected.
1309 Prints a msg and aborts. */
1310extern void VG_(unimplemented) ( Char* msg );
sewardjcfc39b22002-05-08 01:58:18 +00001311extern void VG_(nvidia_moan) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001312
1313/* The stack on which Valgrind runs. We can't use the same stack as the
1314 simulatee -- that's an important design decision. */
1315extern UInt VG_(stack)[10000];
1316
1317/* Similarly, we have to ask for signals to be delivered on an
1318 alternative stack, since it is possible, although unlikely, that
1319 we'll have to run client code from inside the Valgrind-installed
1320 signal handler. If this happens it will be done by
1321 vg_deliver_signal_immediately(). */
1322extern UInt VG_(sigstack)[10000];
1323
sewardjde4a1d02002-03-22 01:27:54 +00001324/* Holds client's %esp at the point we gained control. From this the
1325 client's argc, argv and envp are deduced. */
1326extern Addr VG_(esp_at_startup);
1327extern Int VG_(client_argc);
1328extern Char** VG_(client_argv);
1329extern Char** VG_(client_envp);
1330
1331/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
1332 don't get traced into. */
1333extern void VG_(mash_LD_PRELOAD_string)( Char* ld_preload_str );
1334
1335/* Something of a function looking for a home ... start up GDB. This
1336 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1337 *client's* stack. This is necessary to give GDB the illusion that
1338 the client program really was running on the real cpu. */
1339extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1340
1341/* Spew out vast amounts of junk during JITting? */
1342extern Bool VG_(disassemble);
1343
1344/* 64-bit counter for the number of basic blocks done. */
1345extern ULong VG_(bbs_done);
1346/* 64-bit counter for the number of bbs to go before a debug exit. */
1347extern ULong VG_(bbs_to_go);
1348
1349/* Counts downwards in vg_run_innerloop. */
1350extern UInt VG_(dispatch_ctr);
1351
sewardjde4a1d02002-03-22 01:27:54 +00001352/* Is the client running on the simulated CPU or the real one? */
1353extern Bool VG_(running_on_simd_CPU); /* Initially False */
1354
1355/* The current LRU epoch. */
1356extern UInt VG_(current_epoch);
1357
sewardj7e87e382002-05-03 19:09:05 +00001358/* This is the ThreadId of the last thread the scheduler ran. */
1359extern ThreadId VG_(last_run_tid);
1360
sewardjde4a1d02002-03-22 01:27:54 +00001361
1362/* --- Counters, for informational purposes only. --- */
1363
1364/* Number of lookups which miss the fast tt helper. */
1365extern UInt VG_(tt_fast_misses);
1366
1367/* Counts for LRU informational messages. */
1368
1369/* Number and total o/t size of new translations this epoch. */
1370extern UInt VG_(this_epoch_in_count);
1371extern UInt VG_(this_epoch_in_osize);
1372extern UInt VG_(this_epoch_in_tsize);
1373/* Number and total o/t size of discarded translations this epoch. */
1374extern UInt VG_(this_epoch_out_count);
1375extern UInt VG_(this_epoch_out_osize);
1376extern UInt VG_(this_epoch_out_tsize);
1377/* Number and total o/t size of translations overall. */
1378extern UInt VG_(overall_in_count);
1379extern UInt VG_(overall_in_osize);
1380extern UInt VG_(overall_in_tsize);
1381/* Number and total o/t size of discards overall. */
1382extern UInt VG_(overall_out_count);
1383extern UInt VG_(overall_out_osize);
1384extern UInt VG_(overall_out_tsize);
1385
1386/* The number of LRU-clearings of TT/TC. */
1387extern UInt VG_(number_of_lrus);
1388
1389/* Counts pertaining to the register allocator. */
1390
1391/* total number of uinstrs input to reg-alloc */
1392extern UInt VG_(uinstrs_prealloc);
1393
1394/* total number of uinstrs added due to spill code */
1395extern UInt VG_(uinstrs_spill);
1396
1397/* number of bbs requiring spill code */
1398extern UInt VG_(translations_needing_spill);
1399
1400/* total of register ranks over all translations */
1401extern UInt VG_(total_reg_rank);
1402
1403/* Counts pertaining to the self-modifying-code detection machinery. */
1404
1405/* Total number of writes checked. */
1406//extern UInt VG_(smc_total_check4s);
1407
1408/* Number of writes which the fast smc check couldn't show were
1409 harmless. */
1410extern UInt VG_(smc_cache_passed);
1411
1412/* Numnber of writes which really did write on original code. */
1413extern UInt VG_(smc_fancy_passed);
1414
1415/* Number of translations discarded as a result. */
1416//extern UInt VG_(smc_discard_count);
1417
1418/* Counts pertaining to internal sanity checking. */
1419extern UInt VG_(sanity_fast_count);
1420extern UInt VG_(sanity_slow_count);
1421
sewardj2e93c502002-04-12 11:12:52 +00001422/* Counts pertaining to the scheduler. */
1423extern UInt VG_(num_scheduling_events_MINOR);
1424extern UInt VG_(num_scheduling_events_MAJOR);
1425
sewardjde4a1d02002-03-22 01:27:54 +00001426
1427/* ---------------------------------------------------------------------
1428 Exports of vg_memory.c
1429 ------------------------------------------------------------------ */
1430
1431extern void VGM_(init_memory_audit) ( void );
1432extern Addr VGM_(curr_dataseg_end);
1433extern void VG_(show_reg_tags) ( void );
1434extern void VG_(detect_memory_leaks) ( void );
1435extern void VG_(done_prof_mem) ( void );
1436
1437/* Set permissions for an address range. Not speed-critical. */
1438extern void VGM_(make_noaccess) ( Addr a, UInt len );
1439extern void VGM_(make_writable) ( Addr a, UInt len );
1440extern void VGM_(make_readable) ( Addr a, UInt len );
1441/* Use with care! (read: use for shmat only) */
1442extern void VGM_(make_readwritable) ( Addr a, UInt len );
1443extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1444 UInt len );
1445
1446/* Check permissions for an address range. Not speed-critical. */
1447extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1448extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1449extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1450
sewardj0c3b53f2002-05-01 01:58:35 +00001451/* Sanity checks which may be done at any time. The scheduler decides
1452 when. */
1453extern void VG_(do_sanity_checks) ( Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001454/* Very cheap ... */
1455extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1456
1457/* These functions are called from generated code. */
1458extern void VG_(helperc_STOREV4) ( UInt, Addr );
1459extern void VG_(helperc_STOREV2) ( UInt, Addr );
1460extern void VG_(helperc_STOREV1) ( UInt, Addr );
1461
1462extern UInt VG_(helperc_LOADV1) ( Addr );
1463extern UInt VG_(helperc_LOADV2) ( Addr );
1464extern UInt VG_(helperc_LOADV4) ( Addr );
1465
1466extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1467extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1468extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1469
1470/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1471 space and pass the addresses and values of all addressible,
1472 defined, aligned words to notify_word. This is the basis for the
1473 leak detector. Returns the number of calls made to notify_word. */
1474UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1475
1476/* Is this address within some small distance below %ESP? Used only
1477 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001478extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001479
1480/* Nasty kludgery to deal with applications which switch stacks,
1481 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001482#define VG_PLAUSIBLE_STACK_SIZE 8000000
1483
sewardjc3bd5f52002-05-01 03:24:23 +00001484/* Needed by the pthreads implementation. */
1485#define VGM_WORD_VALID 0
1486#define VGM_WORD_INVALID 0xFFFFFFFF
1487
sewardjde4a1d02002-03-22 01:27:54 +00001488
1489/* ---------------------------------------------------------------------
1490 Exports of vg_syscall_mem.c
1491 ------------------------------------------------------------------ */
1492
sewardj2e93c502002-04-12 11:12:52 +00001493extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001494
sewardj2e93c502002-04-12 11:12:52 +00001495extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1496 Int syscallno,
1497 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001498
1499extern Bool VG_(is_kerror) ( Int res );
1500
sewardj2e93c502002-04-12 11:12:52 +00001501#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1502 VG_(load_thread_state)(thread_id); \
sewardjde4a1d02002-03-22 01:27:54 +00001503 VG_(copy_baseBlock_to_m_state_static)(); \
1504 VG_(do_syscall)(); \
1505 VG_(copy_m_state_static_to_baseBlock)(); \
sewardj2e93c502002-04-12 11:12:52 +00001506 VG_(save_thread_state)(thread_id); \
1507 result_lvalue = VG_(get_thread_state)(thread_id)->m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001508
1509
1510/* ---------------------------------------------------------------------
1511 Exports of vg_transtab.c
1512 ------------------------------------------------------------------ */
1513
1514/* An entry in the translation table (TT). */
1515typedef
1516 struct {
1517 /* +0 */ Addr orig_addr;
1518 /* +4 */ Addr trans_addr;
1519 /* +8 */ UInt mru_epoch;
1520 /* +12 */ UShort orig_size;
1521 /* +14 */ UShort trans_size;
1522 }
1523 TTEntry;
1524
1525/* The number of basic blocks in an epoch (one age-step). */
1526#define VG_BBS_PER_EPOCH 20000
1527
1528extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1529extern void VG_(maybe_do_lru_pass) ( void );
1530extern void VG_(flush_transtab) ( void );
1531extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1532extern void VG_(add_to_trans_tab) ( TTEntry* tte );
1533
1534extern void VG_(smc_mark_original) ( Addr original_addr,
1535 Int original_len );
1536
1537extern void VG_(init_transtab_and_SMC) ( void );
1538
1539extern void VG_(sanity_check_tc_tt) ( void );
1540extern Addr VG_(search_transtab) ( Addr original_addr );
1541
1542extern void VG_(invalidate_tt_fast)( void );
1543
1544
1545/* ---------------------------------------------------------------------
1546 Exports of vg_vtagops.c
1547 ------------------------------------------------------------------ */
1548
1549/* Lists the names of value-tag operations used in instrumented
1550 code. These are the third argument to TAG1 and TAG2 uinsns. */
1551
1552typedef
1553 enum {
1554 /* Unary. */
1555 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1556 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1557
1558 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1559
1560 VgT_Left4, VgT_Left2, VgT_Left1,
1561
1562 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1563 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1564
1565 /* Binary; 1st is rd; 2nd is rd+wr */
1566 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1567 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1568
1569 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1570 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1571 VgT_DebugFn
1572 }
1573 VgTagOp;
1574
1575extern Char* VG_(nameOfTagOp) ( VgTagOp );
1576extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1577
1578
1579/* ---------------------------------------------------------------------
1580 Exports of vg_syscall.S
1581 ------------------------------------------------------------------ */
1582
1583extern void VG_(do_syscall) ( void );
1584
1585
1586/* ---------------------------------------------------------------------
1587 Exports of vg_startup.S
1588 ------------------------------------------------------------------ */
1589
sewardjde4a1d02002-03-22 01:27:54 +00001590extern void VG_(switch_to_real_CPU) ( void );
1591
sewardj35805422002-04-21 13:05:34 +00001592extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1593 Addr m_esp_at_error,
1594 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001595
1596
1597/* ---------------------------------------------------------------------
1598 Exports of vg_dispatch.S
1599 ------------------------------------------------------------------ */
1600
sewardj2e93c502002-04-12 11:12:52 +00001601/* Run a thread for a (very short) while, until some event happens
1602 which means we need to defer to the scheduler. */
1603extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001604
1605
1606/* ---------------------------------------------------------------------
1607 Exports of vg_helpers.S
1608 ------------------------------------------------------------------ */
1609
sewardjde4a1d02002-03-22 01:27:54 +00001610/* SMC fast checks. */
1611extern void VG_(helper_smc_check4);
1612
1613/* Mul, div, etc, -- we don't codegen these directly. */
1614extern void VG_(helper_idiv_64_32);
1615extern void VG_(helper_div_64_32);
1616extern void VG_(helper_idiv_32_16);
1617extern void VG_(helper_div_32_16);
1618extern void VG_(helper_idiv_16_8);
1619extern void VG_(helper_div_16_8);
1620
1621extern void VG_(helper_imul_32_64);
1622extern void VG_(helper_mul_32_64);
1623extern void VG_(helper_imul_16_32);
1624extern void VG_(helper_mul_16_32);
1625extern void VG_(helper_imul_8_16);
1626extern void VG_(helper_mul_8_16);
1627
1628extern void VG_(helper_CLD);
1629extern void VG_(helper_STD);
1630extern void VG_(helper_get_dirflag);
1631
1632extern void VG_(helper_shldl);
1633extern void VG_(helper_shldw);
1634extern void VG_(helper_shrdl);
1635extern void VG_(helper_shrdw);
1636
1637extern void VG_(helper_RDTSC);
1638extern void VG_(helper_CPUID);
1639
sewardjde4a1d02002-03-22 01:27:54 +00001640extern void VG_(helper_bsf);
1641extern void VG_(helper_bsr);
1642
1643extern void VG_(helper_fstsw_AX);
1644extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001645extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001646extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001647
1648extern void VG_(helper_value_check4_fail);
1649extern void VG_(helper_value_check2_fail);
1650extern void VG_(helper_value_check1_fail);
1651extern void VG_(helper_value_check0_fail);
1652
sewardjbc5b99f2002-04-13 00:08:51 +00001653/* NOT FUNCTIONS; these are bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001654extern void VG_(signalreturn_bogusRA)( void );
sewardjbc5b99f2002-04-13 00:08:51 +00001655extern void VG_(pthreadreturn_bogusRA)( void );
sewardj54cacf02002-04-12 23:24:59 +00001656
njn4f9c9342002-04-29 16:03:24 +00001657/* ---------------------------------------------------------------------
1658 Exports of vg_cachesim.c
1659 ------------------------------------------------------------------ */
1660
1661extern UCodeBlock* VG_(cachesim_instrument)(UCodeBlock* cb_in, Addr orig_addr);
1662
1663typedef struct _iCC iCC;
1664typedef struct _idCC idCC;
1665
1666extern void VG_(init_cachesim) ( void );
1667extern void VG_(show_cachesim_results)( Int client_argc, Char** client_argv );
1668
1669extern void VG_(cachesim_log_non_mem_instr)( iCC* cc );
1670extern void VG_(cachesim_log_mem_instr) ( idCC* cc, Addr data_addr );
sewardjde4a1d02002-03-22 01:27:54 +00001671
1672/* ---------------------------------------------------------------------
1673 The state of the simulated CPU.
1674 ------------------------------------------------------------------ */
1675
1676/* This is the Intel register encoding. */
1677#define R_EAX 0
1678#define R_ECX 1
1679#define R_EDX 2
1680#define R_EBX 3
1681#define R_ESP 4
1682#define R_EBP 5
1683#define R_ESI 6
1684#define R_EDI 7
1685
1686#define R_AL (0+R_EAX)
1687#define R_CL (0+R_ECX)
1688#define R_DL (0+R_EDX)
1689#define R_BL (0+R_EBX)
1690#define R_AH (4+R_EAX)
1691#define R_CH (4+R_ECX)
1692#define R_DH (4+R_EDX)
1693#define R_BH (4+R_EBX)
1694
1695
1696/* ---------------------------------------------------------------------
1697 Offsets into baseBlock for everything which needs to referred to
1698 from generated code. The order of these decls does not imply
1699 what the order of the actual offsets is. The latter is important
1700 and is set up in vg_main.c.
1701 ------------------------------------------------------------------ */
1702
1703/* An array of words. In generated code, %ebp always points to the
1704 start of this array. Useful stuff, like the simulated CPU state,
1705 and the addresses of helper functions, can then be found by
1706 indexing off %ebp. The following declares variables which, at
1707 startup time, are given values denoting offsets into baseBlock.
1708 These offsets are in *words* from the start of baseBlock. */
1709
1710#define VG_BASEBLOCK_WORDS 200
1711
1712extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1713
1714
1715/* -----------------------------------------------------
1716 Read-write parts of baseBlock.
1717 -------------------------------------------------- */
1718
1719/* State of the simulated CPU. */
1720extern Int VGOFF_(m_eax);
1721extern Int VGOFF_(m_ecx);
1722extern Int VGOFF_(m_edx);
1723extern Int VGOFF_(m_ebx);
1724extern Int VGOFF_(m_esp);
1725extern Int VGOFF_(m_ebp);
1726extern Int VGOFF_(m_esi);
1727extern Int VGOFF_(m_edi);
1728extern Int VGOFF_(m_eflags);
1729extern Int VGOFF_(m_fpustate);
1730extern Int VGOFF_(m_eip);
1731
1732/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1733extern Int VGOFF_(spillslots);
1734
1735/* Records the valid bits for the 8 integer regs & flags reg. */
1736extern Int VGOFF_(sh_eax);
1737extern Int VGOFF_(sh_ecx);
1738extern Int VGOFF_(sh_edx);
1739extern Int VGOFF_(sh_ebx);
1740extern Int VGOFF_(sh_esp);
1741extern Int VGOFF_(sh_ebp);
1742extern Int VGOFF_(sh_esi);
1743extern Int VGOFF_(sh_edi);
1744extern Int VGOFF_(sh_eflags);
1745
1746
1747/* -----------------------------------------------------
1748 Read-only parts of baseBlock.
1749 -------------------------------------------------- */
1750
1751/* Offsets of addresses of helper functions. A "helper" function is
1752 one which is called from generated code. */
1753
1754extern Int VGOFF_(helper_idiv_64_32);
1755extern Int VGOFF_(helper_div_64_32);
1756extern Int VGOFF_(helper_idiv_32_16);
1757extern Int VGOFF_(helper_div_32_16);
1758extern Int VGOFF_(helper_idiv_16_8);
1759extern Int VGOFF_(helper_div_16_8);
1760
1761extern Int VGOFF_(helper_imul_32_64);
1762extern Int VGOFF_(helper_mul_32_64);
1763extern Int VGOFF_(helper_imul_16_32);
1764extern Int VGOFF_(helper_mul_16_32);
1765extern Int VGOFF_(helper_imul_8_16);
1766extern Int VGOFF_(helper_mul_8_16);
1767
1768extern Int VGOFF_(helper_CLD);
1769extern Int VGOFF_(helper_STD);
1770extern Int VGOFF_(helper_get_dirflag);
1771
1772extern Int VGOFF_(helper_shldl);
1773extern Int VGOFF_(helper_shldw);
1774extern Int VGOFF_(helper_shrdl);
1775extern Int VGOFF_(helper_shrdw);
1776
1777extern Int VGOFF_(helper_RDTSC);
1778extern Int VGOFF_(helper_CPUID);
1779
sewardjde4a1d02002-03-22 01:27:54 +00001780extern Int VGOFF_(helper_bsf);
1781extern Int VGOFF_(helper_bsr);
1782
1783extern Int VGOFF_(helper_fstsw_AX);
1784extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001785extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001786extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001787
1788extern Int VGOFF_(helper_value_check4_fail);
1789extern Int VGOFF_(helper_value_check2_fail);
1790extern Int VGOFF_(helper_value_check1_fail);
1791extern Int VGOFF_(helper_value_check0_fail);
1792
sewardjde4a1d02002-03-22 01:27:54 +00001793extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1794extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1795extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1796
1797extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1798extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1799extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1800
1801extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1802extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1803extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1804
njn4f9c9342002-04-29 16:03:24 +00001805extern Int VGOFF_(cachesim_log_non_mem_instr);
1806extern Int VGOFF_(cachesim_log_mem_instr);
sewardjde4a1d02002-03-22 01:27:54 +00001807
1808#endif /* ndef __VG_INCLUDE_H */
1809
sewardj3b2736a2002-03-24 12:18:35 +00001810
1811/* ---------------------------------------------------------------------
1812 Finally - autoconf-generated settings
1813 ------------------------------------------------------------------ */
1814
1815#include "config.h"
1816
sewardjde4a1d02002-03-22 01:27:54 +00001817/*--------------------------------------------------------------------*/
1818/*--- end vg_include.h ---*/
1819/*--------------------------------------------------------------------*/