blob: 179e41fd41268b79674eef8704ed0a09c1b8dedd [file] [log] [blame]
sewardjde4a1d02002-03-22 01:27:54 +00001
2/*--------------------------------------------------------------------*/
njn25e49d8e72002-09-23 09:36:25 +00003/*--- A header file for all private parts of Valgrind's core. ---*/
sewardjde4a1d02002-03-22 01:27:54 +00004/*--- Include no other! ---*/
5/*--- vg_include.h ---*/
6/*--------------------------------------------------------------------*/
7
8/*
njnc9539842002-10-02 13:26:35 +00009 This file is part of Valgrind, an extensible x86 protected-mode
10 emulator for monitoring program execution on x86-Unixes.
sewardjde4a1d02002-03-22 01:27:54 +000011
njn0e1b5142003-04-15 14:58:06 +000012 Copyright (C) 2000-2003 Julian Seward
sewardjde4a1d02002-03-22 01:27:54 +000013 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
njn25e49d8e72002-09-23 09:36:25 +000030 The GNU General Public License is contained in the file COPYING.
sewardjde4a1d02002-03-22 01:27:54 +000031*/
32
33#ifndef __VG_INCLUDE_H
34#define __VG_INCLUDE_H
35
sewardjde4a1d02002-03-22 01:27:54 +000036/* ---------------------------------------------------------------------
37 Build options and table sizes. You should be able to change these
38 options or sizes, recompile, and still have a working system.
39 ------------------------------------------------------------------ */
40
jsgf855d93d2003-10-13 22:26:55 +000041/* For system call numbers __NR_... */
42#include "vg_unistd.h"
43
sewardjde4a1d02002-03-22 01:27:54 +000044#include "vg_constants.h"
45
sewardj4cf05692002-10-27 20:28:29 +000046/* All stuff visible to core and skins goes in vg_skin.h. Things
47 * visible to core but not visible to any skins should go in this
48 * file, vg_include.h. */
njn25e49d8e72002-09-23 09:36:25 +000049#include "vg_skin.h"
fitzhardinge39de4b42003-10-31 07:12:21 +000050#include "valgrind.h"
sewardjde4a1d02002-03-22 01:27:54 +000051
fitzhardinge98abfc72003-12-16 02:05:15 +000052#undef SK_
53#define SK_(x) vgSkinInternal_##x
54
sewardjde4a1d02002-03-22 01:27:54 +000055/* Total number of spill slots available for allocation, if a TempReg
56 doesn't make it into a RealReg. Just bomb the entire system if
57 this value is too small; we don't expect it will ever get
58 particularly high. */
59#define VG_MAX_SPILLSLOTS 24
60
61
62/* Constants for the slow translation lookup cache. */
63#define VG_TRANSTAB_SLOW_BITS 11
64#define VG_TRANSTAB_SLOW_SIZE (1 << VG_TRANSTAB_SLOW_BITS)
65#define VG_TRANSTAB_SLOW_MASK ((VG_TRANSTAB_SLOW_SIZE) - 1)
66
67/* Size of a buffer used for creating messages. */
68#define M_VG_MSGBUF 10000
69
70/* Size of a smallish table used to read /proc/self/map entries. */
sewardjebc82332002-04-24 14:44:23 +000071#define M_PROCMAP_BUF 50000
sewardjde4a1d02002-03-22 01:27:54 +000072
73/* Max length of pathname to a .so/executable file. */
74#define M_VG_LIBNAMESTR 100
75
76/* Max length of a text fragment used to construct error messages. */
77#define M_VG_ERRTXT 512
78
79/* Max length of the string copied from env var VG_ARGS at startup. */
80#define M_VG_CMDLINE_STRLEN 1000
81
82/* Max number of options for Valgrind which we can handle. */
83#define M_VG_CMDLINE_OPTS 100
84
85/* After this many different unsuppressed errors have been observed,
86 be more conservative about collecting new ones. */
87#define M_VG_COLLECT_ERRORS_SLOWLY_AFTER 50
88
89/* After this many different unsuppressed errors have been observed,
90 stop collecting errors at all, and tell the user their program is
91 evidently a steaming pile of camel dung. */
sewardj1bebcbf2002-04-24 21:24:18 +000092#define M_VG_COLLECT_NO_ERRORS_AFTER_SHOWN 300
sewardjf2537be2002-04-24 21:03:47 +000093
94/* After this many total errors have been observed, stop collecting
95 errors at all. Counterpart to M_VG_COLLECT_NO_ERRORS_AFTER_SHOWN. */
sewardj1bebcbf2002-04-24 21:24:18 +000096#define M_VG_COLLECT_NO_ERRORS_AFTER_FOUND 30000
sewardjde4a1d02002-03-22 01:27:54 +000097
sewardjde4a1d02002-03-22 01:27:54 +000098/* The maximum number of calls we're prepared to save in a
99 backtrace. */
100#define VG_DEEPEST_BACKTRACE 50
101
sewardjde4a1d02002-03-22 01:27:54 +0000102/* Number of lists in which we keep track of ExeContexts. Should be
103 prime. */
sewardj59fb25c2003-09-28 16:32:58 +0000104#define VG_N_EC_LISTS 4999 /* a prime number */
sewardjde4a1d02002-03-22 01:27:54 +0000105
sewardj2e93c502002-04-12 11:12:52 +0000106/* Defines the thread-scheduling timeslice, in terms of the number of
107 basic blocks we attempt to run each thread for. Smaller values
108 give finer interleaving but much increased scheduling overheads. */
sewardj4505b9e2002-05-28 11:27:31 +0000109#define VG_SCHEDULING_QUANTUM 50000
sewardj2e93c502002-04-12 11:12:52 +0000110
jsgf855d93d2003-10-13 22:26:55 +0000111/* Maximum FD Valgrind can use for its internal file descriptors. */
112#define VG_MAX_SAFE_FD 1024 /* usual ulimit */
113
114/* Maximum allowed application-visible file descriptor. Valgrind's
115 internal fds hide above this (starting at VG_MAX_FD+1). This is
116 derived from the default fd limit (1024) minus the 2 fds per thread
117 and a small number of extra fds. */
118#define VG_MAX_FD (VG_MAX_SAFE_FD - (VG_N_THREADS*2 + 4))
sewardj2e93c502002-04-12 11:12:52 +0000119
sewardjbf290b92002-05-01 02:28:01 +0000120/* Stack size for a thread. We try and check that they do not go
121 beyond it. */
sewardjf0b06452002-06-04 08:38:04 +0000122#define VG_PTHREAD_STACK_SIZE (1 << 20)
sewardjbf290b92002-05-01 02:28:01 +0000123
sewardj20917d82002-05-28 01:36:45 +0000124/* Number of entries in the semaphore-remapping table. */
125#define VG_N_SEMAPHORES 50
126
127/* Number of entries in the rwlock-remapping table. */
sewardj89745a52002-09-27 01:04:29 +0000128#define VG_N_RWLOCKS 500
sewardj20917d82002-05-28 01:36:45 +0000129
sewardj8ad94e12002-05-29 00:10:20 +0000130/* Number of entries in each thread's cleanup stack. */
sewardj61821c02003-05-04 13:02:10 +0000131#define VG_N_CLEANUPSTACK 16
sewardj8ad94e12002-05-29 00:10:20 +0000132
sewardj2cb00342002-06-28 01:46:26 +0000133/* Number of entries in each thread's fork-handler stack. */
sewardj4700f042003-07-26 17:49:58 +0000134#define VG_N_FORKHANDLERSTACK 4
sewardj2cb00342002-06-28 01:46:26 +0000135
njn25e49d8e72002-09-23 09:36:25 +0000136/* Max number of callers for context in a suppression. */
137#define VG_N_SUPP_CALLERS 4
sewardj73cf3bc2002-11-03 03:20:15 +0000138
njn6eba4ef2003-05-01 08:06:41 +0000139/* Valgrind's stack sizes, in words */
140#define VG_STACK_SIZE_W 10000
141#define VG_SIGSTACK_SIZE_W 10000
njn12a57142003-04-30 20:49:10 +0000142
fitzhardinge98abfc72003-12-16 02:05:15 +0000143/* Useful macros */
144/* a - alignment - must be a power of 2 */
145#define ROUNDDN(p, a) ((Addr)(p) & ~((a)-1))
146#define ROUNDUP(p, a) ROUNDDN((p)+(a)-1, (a))
147#define PGROUNDDN(p) ROUNDDN(p, VKI_BYTES_PER_PAGE)
148#define PGROUNDUP(p) ROUNDUP(p, VKI_BYTES_PER_PAGE)
149
150
sewardjde4a1d02002-03-22 01:27:54 +0000151/* ---------------------------------------------------------------------
152 Basic types
153 ------------------------------------------------------------------ */
154
sewardjde4a1d02002-03-22 01:27:54 +0000155/* Just pray that gcc's constant folding works properly ... */
156#define BITS(bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0) \
157 ( ((bit7) << 7) | ((bit6) << 6) | ((bit5) << 5) | ((bit4) << 4) \
158 | ((bit3) << 3) | ((bit2) << 2) | ((bit1) << 1) | (bit0))
159
sewardjde4a1d02002-03-22 01:27:54 +0000160/* ---------------------------------------------------------------------
161 Command-line-settable options
162 ------------------------------------------------------------------ */
163
sewardj4f094a72002-11-05 23:37:35 +0000164/* Default destination port to be used in logging over a network, if
165 none specified. */
166#define VG_CLO_DEFAULT_LOGPORT 1500
sewardj73cf3bc2002-11-03 03:20:15 +0000167
168/* The max number of suppression files. */
sewardjde4a1d02002-03-22 01:27:54 +0000169#define VG_CLO_MAX_SFILES 10
170
sewardj4cf05692002-10-27 20:28:29 +0000171/* Describes where logging output is to be sent. */
172typedef
173 enum {
174 VgLogTo_Fd,
175 VgLogTo_File,
176 VgLogTo_Socket
177 } VgLogTo;
178
jsgf855d93d2003-10-13 22:26:55 +0000179/* pid of main process */
180extern Int VG_(main_pid);
181
182/* pgrp of process (global to all threads) */
183extern Int VG_(main_pgrp);
sewardj4cf05692002-10-27 20:28:29 +0000184
sewardj72f98ff2002-06-13 17:23:38 +0000185/* Should we stop collecting errors if too many appear? default: YES */
sewardj2e432902002-06-13 20:44:00 +0000186extern Bool VG_(clo_error_limit);
sewardjde4a1d02002-03-22 01:27:54 +0000187/* Enquire about whether to attach to GDB at errors? default: NO */
188extern Bool VG_(clo_GDB_attach);
sewardj6024b212003-07-13 10:54:33 +0000189/* The path to GDB? default: whatever ./configure found */
190extern Char* VG_(clo_GDB_path);
njn43c799e2003-04-08 00:08:52 +0000191/* Enquire about generating a suppression for each error? default: NO */
192extern Bool VG_(clo_gen_suppressions);
sewardjde4a1d02002-03-22 01:27:54 +0000193/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
194extern Int VG_(sanity_level);
sewardjde4a1d02002-03-22 01:27:54 +0000195/* Automatically attempt to demangle C++ names? default: YES */
196extern Bool VG_(clo_demangle);
sewardjde4a1d02002-03-22 01:27:54 +0000197/* Simulate child processes? default: NO */
198extern Bool VG_(clo_trace_children);
sewardj4cf05692002-10-27 20:28:29 +0000199
200/* Where logging output is to be sent to.
201
202 When log_to == VgLogTo_Fd, clo_logfile_fd holds the file id, and is
203 taken from the command line. clo_logfile_name is irrelevant.
204
205 When log_to == VgLogTo_File, clo_logfile_name holds the logfile
206 name, and is taken from the command line. clo_logfile_fd is then
207 made to hold the relevant file id, by opening clo_logfile_name
208 (concatenated with the process ID) for writing.
209
210 When log_to == VgLogTo_Socket, clo_logfile_name holds the
211 hostname:portnumber pair, and is taken from the command line.
212 clo_logfile_fd is then made to hold the relevant file handle, by
213 opening a connection to said hostname:portnumber pair.
214
215 Global default is to set log_to == VgLogTo_Fd and logfile_fd == 2
216 (stderr). */
217extern VgLogTo VG_(clo_log_to);
218extern Int VG_(clo_logfile_fd);
219extern Char* VG_(clo_logfile_name);
sewardjde4a1d02002-03-22 01:27:54 +0000220
sewardj6024b212003-07-13 10:54:33 +0000221/* The file descriptor to read for input. default: 0 == stdin */
222extern Int VG_(clo_input_fd);
sewardjde4a1d02002-03-22 01:27:54 +0000223/* The number of suppression files specified. */
224extern Int VG_(clo_n_suppressions);
225/* The names of the suppression files. */
226extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
227
228/* Single stepping? default: NO */
229extern Bool VG_(clo_single_step);
230/* Code improvement? default: YES */
231extern Bool VG_(clo_optimise);
njn25e49d8e72002-09-23 09:36:25 +0000232/* DEBUG: print generated code? default: 00000 ( == NO ) */
233extern Bool VG_(clo_trace_codegen);
sewardjde4a1d02002-03-22 01:27:54 +0000234/* DEBUG: print system calls? default: NO */
235extern Bool VG_(clo_trace_syscalls);
236/* DEBUG: print signal details? default: NO */
237extern Bool VG_(clo_trace_signals);
238/* DEBUG: print symtab details? default: NO */
239extern Bool VG_(clo_trace_symtab);
sewardj8937c812002-04-12 20:12:20 +0000240/* DEBUG: print thread scheduling events? default: NO */
241extern Bool VG_(clo_trace_sched);
sewardj45b4b372002-04-16 22:50:32 +0000242/* DEBUG: print pthread (mutex etc) events? default: 0 (none), 1
243 (some), 2 (all) */
244extern Int VG_(clo_trace_pthread_level);
sewardjde4a1d02002-03-22 01:27:54 +0000245/* Stop after this many basic blocks. default: Infinity. */
246extern ULong VG_(clo_stop_after);
247/* Display gory details for the k'th most popular error. default:
248 Infinity. */
249extern Int VG_(clo_dump_error);
250/* Number of parents of a backtrace. Default: 8. */
251extern Int VG_(clo_backtrace_size);
daywalker7e73e5f2003-07-04 16:18:15 +0000252/* Engage miscellaneous weird hacks needed for some progs. */
sewardj8d365b52002-05-12 10:52:16 +0000253extern Char* VG_(clo_weird_hacks);
jsgf855d93d2003-10-13 22:26:55 +0000254/* How often we should poll for signals, assuming we need to poll for
255 signals. */
256extern Int VG_(clo_signal_polltime);
257
258/* Low latency syscalls and signals */
259extern Bool VG_(clo_lowlat_syscalls);
260extern Bool VG_(clo_lowlat_signals);
261
rjwalshf5f536f2003-11-17 17:45:00 +0000262/* Track open file descriptors? */
263extern Bool VG_(clo_track_fds);
264
sewardj858964b2002-10-05 14:15:43 +0000265/* Should we run __libc_freeres at exit? Sometimes causes crashes.
266 Default: YES. Note this is subservient to VG_(needs).libc_freeres;
267 if the latter says False, then the setting of VG_(clo_weird_hacks)
268 is ignored. Ie if a skin says no, I don't want this to run, that
269 cannot be overridden from the command line. */
270extern Bool VG_(clo_run_libc_freeres);
sewardjb5ff83e2002-12-01 19:40:49 +0000271/* Use the basic-block chaining optimisation? Default: YES */
sewardj22854b92002-11-30 14:00:47 +0000272extern Bool VG_(clo_chain_bb);
fitzhardinge462f4f92003-12-18 02:10:54 +0000273/* Generate branch-prediction hints? */
274extern Bool VG_(clo_branchpred);
nethercote77eba602003-11-13 17:35:04 +0000275/* Continue stack traces below main()? Default: NO */
276extern Bool VG_(clo_show_below_main);
fitzhardinge98abfc72003-12-16 02:05:15 +0000277/* Test each client pointer dereference to check it's within the
278 client address space bounds */
279extern Bool VG_(clo_pointercheck);
sewardjde4a1d02002-03-22 01:27:54 +0000280
281/* ---------------------------------------------------------------------
282 Debugging and profiling stuff
283 ------------------------------------------------------------------ */
284
sewardjde4a1d02002-03-22 01:27:54 +0000285/* Create a logfile into which messages can be dumped. */
286extern void VG_(startup_logging) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000287extern void VG_(shutdown_logging)( void );
sewardjde4a1d02002-03-22 01:27:54 +0000288
289extern void VGP_(init_profiling) ( void );
290extern void VGP_(done_profiling) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000291
njn25e49d8e72002-09-23 09:36:25 +0000292#undef VGP_PUSHCC
293#undef VGP_POPCC
294#define VGP_PUSHCC(x) if (VG_(clo_profile)) VGP_(pushcc)(x)
295#define VGP_POPCC(x) if (VG_(clo_profile)) VGP_(popcc)(x)
sewardjde4a1d02002-03-22 01:27:54 +0000296
sewardjde4a1d02002-03-22 01:27:54 +0000297/* ---------------------------------------------------------------------
njn810086f2002-11-14 12:42:47 +0000298 Skin-related types
299 ------------------------------------------------------------------ */
300/* These structs are not exposed to skins to mitigate possibility of
301 binary-incompatibilities when the core/skin interface changes. Instead,
302 set functions are provided (see include/vg_skin.h). */
303typedef
304 struct {
305 Char* name;
306 Char* version;
307 Char* description;
308 Char* copyright_author;
309 Char* bug_reports_to;
njn120281f2003-02-03 12:20:07 +0000310 UInt avg_translation_sizeB;
njn810086f2002-11-14 12:42:47 +0000311 }
312 VgDetails;
313
314extern VgDetails VG_(details);
315
316/* If new fields are added to this type, update:
317 * - vg_main.c:initialisation of VG_(needs)
318 * - vg_main.c:sanity_check_needs()
319 *
320 * If the name of this type or any of its fields change, update:
321 * - dependent comments (just search for "VG_(needs)").
322 */
323typedef
324 struct {
325 Bool libc_freeres;
326 Bool core_errors;
327
328 Bool skin_errors;
329 Bool basic_block_discards;
330 Bool shadow_regs;
331 Bool command_line_options;
332 Bool client_requests;
333 Bool extended_UCode;
334 Bool syscall_wrapper;
njn810086f2002-11-14 12:42:47 +0000335 Bool sanity_checks;
336 Bool data_syms;
fitzhardinge98abfc72003-12-16 02:05:15 +0000337 Bool shadow_memory;
njn810086f2002-11-14 12:42:47 +0000338 }
339 VgNeeds;
340
341extern VgNeeds VG_(needs);
342
fitzhardinge98abfc72003-12-16 02:05:15 +0000343extern void VG_(tool_init_dlsym)(void *dlhandle);
njn810086f2002-11-14 12:42:47 +0000344
fitzhardinge98abfc72003-12-16 02:05:15 +0000345#include "vg_toolint.h"
njn810086f2002-11-14 12:42:47 +0000346
347/* ---------------------------------------------------------------------
348 Exports of vg_needs.c
349 ------------------------------------------------------------------ */
350
351void VG_(sanity_check_needs)(void);
352
353/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000354 Exports of vg_malloc2.c
355 ------------------------------------------------------------------ */
356
357/* Allocation arenas.
njn3e884182003-04-15 13:03:23 +0000358
359 CORE for the core's general use.
360 SKIN for the skin to use (and the only one it uses).
361 SYMTAB for Valgrind's symbol table storage.
362 JITTER for small storage during translation.
363 CLIENT for the client's mallocs/frees, if the skin replaces glibc's
364 malloc() et al -- redzone size is chosen by the skin.
365 DEMANGLE for the C++ demangler.
366 EXECTXT for storing ExeContexts.
367 ERRORS for storing CoreErrors.
368 TRANSIENT for very short-term use. It should be empty in between uses.
369
njn25e49d8e72002-09-23 09:36:25 +0000370 When adding a new arena, remember also to add it to ensure_mm_init().
sewardjde4a1d02002-03-22 01:27:54 +0000371*/
372typedef Int ArenaId;
373
njn3e884182003-04-15 13:03:23 +0000374#define VG_N_ARENAS 9
sewardjde4a1d02002-03-22 01:27:54 +0000375
njn3e884182003-04-15 13:03:23 +0000376#define VG_AR_CORE 0
377#define VG_AR_SKIN 1
378#define VG_AR_SYMTAB 2
379#define VG_AR_JITTER 3
380#define VG_AR_CLIENT 4
381#define VG_AR_DEMANGLE 5
382#define VG_AR_EXECTXT 6
383#define VG_AR_ERRORS 7
384#define VG_AR_TRANSIENT 8
sewardjde4a1d02002-03-22 01:27:54 +0000385
njn25e49d8e72002-09-23 09:36:25 +0000386extern void* VG_(arena_malloc) ( ArenaId arena, Int nbytes );
387extern void VG_(arena_free) ( ArenaId arena, void* ptr );
njn3e884182003-04-15 13:03:23 +0000388extern void* VG_(arena_calloc) ( ArenaId arena, Int alignment,
389 Int nmemb, Int nbytes );
njn25e49d8e72002-09-23 09:36:25 +0000390extern void* VG_(arena_realloc) ( ArenaId arena, void* ptr, Int alignment,
391 Int size );
392extern void* VG_(arena_malloc_aligned) ( ArenaId aid, Int req_alignB,
sewardjde4a1d02002-03-22 01:27:54 +0000393 Int req_pszB );
394
njn8a6b6c02003-04-22 22:45:55 +0000395extern Int VG_(arena_payload_szB) ( ArenaId aid, void* payload );
396
sewardjde4a1d02002-03-22 01:27:54 +0000397extern void VG_(mallocSanityCheckAll) ( void );
398
399extern void VG_(show_all_arena_stats) ( void );
400extern Bool VG_(is_empty_arena) ( ArenaId aid );
401
sewardjecf8e102003-07-12 12:11:39 +0000402/* Returns True if aa is inside any block mmap'd /dev/zero
403 by our low-level memory manager. */
404extern Bool VG_(is_inside_segment_mmapd_by_low_level_MM)( Addr aa );
405
sewardjde4a1d02002-03-22 01:27:54 +0000406
sewardjde4a1d02002-03-22 01:27:54 +0000407/* ---------------------------------------------------------------------
njn3e884182003-04-15 13:03:23 +0000408 Exports of vg_intercept.c
sewardj2e93c502002-04-12 11:12:52 +0000409 ------------------------------------------------------------------ */
410
411/* This doesn't export code or data that valgrind.so needs to link
412 against. However, the scheduler does need to know the following
413 request codes. A few, publically-visible, request codes are also
njn25e49d8e72002-09-23 09:36:25 +0000414 defined in valgrind.h, and similar headers for some skins. */
sewardj2e93c502002-04-12 11:12:52 +0000415
njn4c791212003-05-02 17:53:54 +0000416#define VG_USERREQ__MALLOC 0x2001
417#define VG_USERREQ__FREE 0x2002
418
sewardj20917d82002-05-28 01:36:45 +0000419/* (Fn, Arg): Create a new thread and run Fn applied to Arg in it. Fn
420 MUST NOT return -- ever. Eventually it will do either __QUIT or
421 __WAIT_JOINER. */
422#define VG_USERREQ__APPLY_IN_NEW_THREAD 0x3001
423
424/* ( no-args ): calling thread disappears from the system forever.
425 Reclaim resources. */
426#define VG_USERREQ__QUIT 0x3002
427
428/* ( void* ): calling thread waits for joiner and returns the void* to
429 it. */
430#define VG_USERREQ__WAIT_JOINER 0x3003
431
432/* ( ThreadId, void** ): wait to join a thread. */
433#define VG_USERREQ__PTHREAD_JOIN 0x3004
434
435/* Set cancellation state and type for this thread. */
436#define VG_USERREQ__SET_CANCELSTATE 0x3005
437#define VG_USERREQ__SET_CANCELTYPE 0x3006
438
439/* ( no-args ): Test if we are at a cancellation point. */
440#define VG_USERREQ__TESTCANCEL 0x3007
441
442/* ( ThreadId, &thread_exit_wrapper is the only allowable arg ): call
443 with this arg to indicate that a cancel is now pending for the
444 specified thread. */
445#define VG_USERREQ__SET_CANCELPEND 0x3008
446
447/* Set/get detach state for this thread. */
448#define VG_USERREQ__SET_OR_GET_DETACH 0x3009
449
450#define VG_USERREQ__PTHREAD_GET_THREADID 0x300B
451#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x300C
452#define VG_USERREQ__PTHREAD_MUTEX_TRYLOCK 0x300D
453#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x300E
454#define VG_USERREQ__PTHREAD_COND_WAIT 0x300F
455#define VG_USERREQ__PTHREAD_COND_TIMEDWAIT 0x3010
456#define VG_USERREQ__PTHREAD_COND_SIGNAL 0x3011
457#define VG_USERREQ__PTHREAD_COND_BROADCAST 0x3012
458#define VG_USERREQ__PTHREAD_KEY_CREATE 0x3013
459#define VG_USERREQ__PTHREAD_KEY_DELETE 0x3014
sewardj00a66b12002-10-12 16:42:35 +0000460#define VG_USERREQ__PTHREAD_SETSPECIFIC_PTR 0x3015
461#define VG_USERREQ__PTHREAD_GETSPECIFIC_PTR 0x3016
sewardj20917d82002-05-28 01:36:45 +0000462#define VG_USERREQ__READ_MILLISECOND_TIMER 0x3017
463#define VG_USERREQ__PTHREAD_SIGMASK 0x3018
jsgf855d93d2003-10-13 22:26:55 +0000464#define VG_USERREQ__SIGWAIT 0x3019 /* unused */
sewardj20917d82002-05-28 01:36:45 +0000465#define VG_USERREQ__PTHREAD_KILL 0x301A
466#define VG_USERREQ__PTHREAD_YIELD 0x301B
sewardj00a66b12002-10-12 16:42:35 +0000467#define VG_USERREQ__PTHREAD_KEY_VALIDATE 0x301C
sewardj2e93c502002-04-12 11:12:52 +0000468
sewardj8ad94e12002-05-29 00:10:20 +0000469#define VG_USERREQ__CLEANUP_PUSH 0x3020
470#define VG_USERREQ__CLEANUP_POP 0x3021
sewardj870497a2002-05-29 01:06:47 +0000471#define VG_USERREQ__GET_KEY_D_AND_S 0x3022
sewardj8ad94e12002-05-29 00:10:20 +0000472
sewardjef037c72002-05-30 00:40:03 +0000473#define VG_USERREQ__NUKE_OTHER_THREADS 0x3023
sewardjefbfcdf2002-06-19 17:35:45 +0000474
475/* Ask how many signal handler returns have happened to this
476 thread. */
jsgf855d93d2003-10-13 22:26:55 +0000477#define VG_USERREQ__GET_N_SIGS_RETURNED 0x3024 /* unused */
sewardjef037c72002-05-30 00:40:03 +0000478
sewardj2cb00342002-06-28 01:46:26 +0000479/* Get/set entries for a thread's pthread_atfork stack. */
480#define VG_USERREQ__SET_FHSTACK_USED 0x3025
481#define VG_USERREQ__GET_FHSTACK_USED 0x3026
482#define VG_USERREQ__SET_FHSTACK_ENTRY 0x3027
483#define VG_USERREQ__GET_FHSTACK_ENTRY 0x3028
sewardjefbfcdf2002-06-19 17:35:45 +0000484
sewardj1fe7b002002-07-16 01:43:15 +0000485/* Denote the finish of VG_(__libc_freeres_wrapper). */
486#define VG_USERREQ__LIBC_FREERES_DONE 0x3029
fitzhardinge98abfc72003-12-16 02:05:15 +0000487#define VG_USERREQ__REGISTER_LIBC_FREERES 0x302A
488
489/* Allocate RT signals */
490#define VG_USERREQ__GET_SIGRT_MIN 0x302B
491#define VG_USERREQ__GET_SIGRT_MAX 0x302C
492#define VG_USERREQ__ALLOC_RTSIG 0x302D
493
494/* Hook for replace_malloc.o to get malloc functions */
495#define VG_USERREQ__GET_MALLOCFUNCS 0x3030
496
497/* Hook for interface to vg_inject.so */
498#define VG_USERREQ__REGISTER_REDIRECT_SYM 0x3031
499#define VG_USERREQ__REGISTER_REDIRECT_ADDR 0x3032
sewardj1fe7b002002-07-16 01:43:15 +0000500
sewardj45b4b372002-04-16 22:50:32 +0000501/* Cosmetic ... */
502#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
sewardj4dced352002-06-04 22:54:20 +0000503/* Log a pthread error from client-space. Cosmetic. */
504#define VG_USERREQ__PTHREAD_ERROR 0x3102
fitzhardinge39de4b42003-10-31 07:12:21 +0000505/* Internal equivalent of VALGRIND_PRINTF . */
506#define VG_USERREQ__INTERNAL_PRINTF 0x3103
507/* Internal equivalent of VALGRIND_PRINTF_BACKTRACE . */
508#define VG_USERREQ__INTERNAL_PRINTF_BACKTRACE 0x3104
sewardj45b4b372002-04-16 22:50:32 +0000509
sewardj54cacf02002-04-12 23:24:59 +0000510/*
511In vg_constants.h:
512#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardj54cacf02002-04-12 23:24:59 +0000513*/
514
njn4c791212003-05-02 17:53:54 +0000515
fitzhardinge98abfc72003-12-16 02:05:15 +0000516struct vg_mallocfunc_info {
517 /* things vg_replace_malloc.o needs to know about */
518 Addr sk_malloc;
519 Addr sk_calloc;
520 Addr sk_realloc;
521 Addr sk_memalign;
522 Addr sk___builtin_new;
523 Addr sk___builtin_vec_new;
524 Addr sk_free;
525 Addr sk___builtin_delete;
526 Addr sk___builtin_vec_delete;
527
528 Addr arena_payload_szB;
529
530 Bool clo_sloppy_malloc;
531 Bool clo_trace_malloc;
532};
sewardj1fe7b002002-07-16 01:43:15 +0000533
fitzhardinge39de4b42003-10-31 07:12:21 +0000534__attribute__((weak))
535int
536VALGRIND_INTERNAL_PRINTF(char *format, ...)
537{
538 unsigned int _qzz_res = 0;
539 va_list vargs;
540 va_start(vargs, format);
541 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, VG_USERREQ__INTERNAL_PRINTF,
542 (unsigned int)format, (unsigned int)vargs, 0, 0);
543 va_end(vargs);
544 return _qzz_res;
545}
546
547__attribute__((weak))
548int
549VALGRIND_INTERNAL_PRINTF_BACKTRACE(char *format, ...)
550{
551 unsigned int _qzz_res = 0;
552 va_list vargs;
553 va_start(vargs, format);
554 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, VG_USERREQ__INTERNAL_PRINTF_BACKTRACE,
555 (unsigned int)format, (unsigned int)vargs, 0, 0);
556 va_end(vargs);
557 return _qzz_res;
558}
559
sewardj54cacf02002-04-12 23:24:59 +0000560
sewardj2e93c502002-04-12 11:12:52 +0000561/* ---------------------------------------------------------------------
562 Constants pertaining to the simulated CPU state, VG_(baseBlock),
563 which need to go here to avoid ugly circularities.
564 ------------------------------------------------------------------ */
565
sewardjb91ae7f2003-04-29 23:50:00 +0000566/* How big is the saved SSE/SSE2 state? Note that this subsumes the
567 FPU state. On machines without SSE, we just save/restore the FPU
568 state into the first part of this area. */
569/* A general comment about SSE save/restore: It appears that the 7th
570 word (which is the MXCSR) has to be &ed with 0x0000FFBF in order
571 that restoring from it later does not cause a GP fault (which is
572 delivered as a segfault). I guess this will have to be done
573 any time we do fxsave :-( 7th word means word offset 6 or byte
574 offset 24 from the start address of the save area.
575 */
576#define VG_SIZE_OF_SSESTATE 512
sewardj2e93c502002-04-12 11:12:52 +0000577/* ... and in words ... */
sewardjb91ae7f2003-04-29 23:50:00 +0000578#define VG_SIZE_OF_SSESTATE_W ((VG_SIZE_OF_SSESTATE+3)/4)
sewardj2e93c502002-04-12 11:12:52 +0000579
580
581/* ---------------------------------------------------------------------
njn3e884182003-04-15 13:03:23 +0000582 Exports of vg_defaults.c
583 ------------------------------------------------------------------ */
584
585extern Bool VG_(sk_malloc_called_by_scheduler);
586
587
588/* ---------------------------------------------------------------------
sewardj92a59562002-09-30 00:53:10 +0000589 Exports of vg_ldt.c
590 ------------------------------------------------------------------ */
591
592/* This is the hardware-format for a segment descriptor, ie what the
593 x86 actually deals with. It is 8 bytes long. It's ugly. */
594
595typedef struct _LDT_ENTRY {
596 union {
597 struct {
598 UShort LimitLow;
599 UShort BaseLow;
600 unsigned BaseMid : 8;
601 unsigned Type : 5;
602 unsigned Dpl : 2;
603 unsigned Pres : 1;
604 unsigned LimitHi : 4;
605 unsigned Sys : 1;
606 unsigned Reserved_0 : 1;
607 unsigned Default_Big : 1;
608 unsigned Granularity : 1;
609 unsigned BaseHi : 8;
610 } Bits;
611 struct {
612 UInt word1;
613 UInt word2;
614 } Words;
615 }
616 LdtEnt;
617} VgLdtEntry;
618
619/* Maximum number of LDT entries supported (by the x86). */
620#define VG_M_LDT_ENTRIES 8192
621/* The size of each LDT entry == sizeof(VgLdtEntry) */
622#define VG_LDT_ENTRY_SIZE 8
623
624/* Alloc & copy, and dealloc. */
625extern VgLdtEntry*
626 VG_(allocate_LDT_for_thread) ( VgLdtEntry* parent_ldt );
627extern void
628 VG_(deallocate_LDT_for_thread) ( VgLdtEntry* ldt );
629
630/* Simulate the modify_ldt syscall. */
631extern Int VG_(sys_modify_ldt) ( ThreadId tid,
632 Int func, void* ptr, UInt bytecount );
633
sewardje1042472002-09-30 12:33:11 +0000634/* Called from generated code. Given a segment selector and a virtual
635 address, return a linear address, and do limit checks too. */
636extern Addr VG_(do_useseg) ( UInt seg_selector, Addr virtual_addr );
637
sewardj92a59562002-09-30 00:53:10 +0000638
639/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000640 Exports of vg_scheduler.c
641 ------------------------------------------------------------------ */
642
sewardj2e93c502002-04-12 11:12:52 +0000643typedef
jsgf855d93d2003-10-13 22:26:55 +0000644 enum ThreadStatus {
sewardj2e93c502002-04-12 11:12:52 +0000645 VgTs_Empty, /* this slot is not in use */
646 VgTs_Runnable, /* waiting to be scheduled */
647 VgTs_WaitJoiner, /* waiting for someone to do join on me */
648 VgTs_WaitJoinee, /* waiting for the thread I did join on */
sewardj2e93c502002-04-12 11:12:52 +0000649 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000650 VgTs_WaitCV, /* waiting on a condition variable */
jsgf855d93d2003-10-13 22:26:55 +0000651 VgTs_WaitSys, /* waiting for a syscall to complete */
652 VgTs_Sleeping, /* sleeping for a while */
sewardj2e93c502002-04-12 11:12:52 +0000653 }
654 ThreadStatus;
sewardj8ad94e12002-05-29 00:10:20 +0000655
656/* An entry in a threads's cleanup stack. */
657typedef
658 struct {
659 void (*fn)(void*);
660 void* arg;
661 }
662 CleanupEntry;
sewardj2cb00342002-06-28 01:46:26 +0000663
664/* An entry in a thread's fork-handler stack. */
665typedef
666 struct {
667 void (*prepare)(void);
668 void (*parent)(void);
669 void (*child)(void);
670 }
671 ForkHandlerEntry;
672
jsgf855d93d2003-10-13 22:26:55 +0000673typedef struct ProxyLWP ProxyLWP;
sewardj2cb00342002-06-28 01:46:26 +0000674
njn72718642003-07-24 08:45:32 +0000675typedef
676 struct _ThreadState {
njn25e49d8e72002-09-23 09:36:25 +0000677 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
678 The thread identity is simply the index in vg_threads[].
679 ThreadId == 1 is the root thread and has the special property
680 that we don't try and allocate or deallocate its stack. For
681 convenience of generating error message, we also put the
682 ThreadId in this tid field, but be aware that it should
683 ALWAYS == the index in vg_threads[]. */
684 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000685
njn25e49d8e72002-09-23 09:36:25 +0000686 /* Current scheduling status.
sewardj5f07b662002-04-23 16:52:51 +0000687
njn25e49d8e72002-09-23 09:36:25 +0000688 Complications: whenever this is set to VgTs_WaitMX, you
689 should also set .m_edx to whatever the required return value
690 is for pthread_mutex_lock / pthread_cond_timedwait for when
691 the mutex finally gets unblocked. */
692 ThreadStatus status;
sewardj2e93c502002-04-12 11:12:52 +0000693
njn25e49d8e72002-09-23 09:36:25 +0000694 /* When .status == WaitMX, points to the mutex I am waiting for.
695 When .status == WaitCV, points to the mutex associated with
696 the condition variable indicated by the .associated_cv field.
697 In all other cases, should be NULL. */
698 void* /*pthread_mutex_t* */ associated_mx;
sewardj3b5d8862002-04-20 13:53:23 +0000699
njn25e49d8e72002-09-23 09:36:25 +0000700 /* When .status == WaitCV, points to the condition variable I am
701 waiting for. In all other cases, should be NULL. */
702 void* /*pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000703
njn25e49d8e72002-09-23 09:36:25 +0000704 /* If VgTs_Sleeping, this is when we should wake up, measured in
njn6c846552003-09-16 07:41:43 +0000705 milliseconds as supplied by VG_(read_millisecond_timer).
sewardj2e93c502002-04-12 11:12:52 +0000706
njn25e49d8e72002-09-23 09:36:25 +0000707 If VgTs_WaitCV, this indicates the time at which
708 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
709 this means infinitely far in the future, viz,
710 pthread_cond_wait. */
711 UInt awaken_at;
sewardj20917d82002-05-28 01:36:45 +0000712
njn25e49d8e72002-09-23 09:36:25 +0000713 /* If VgTs_WaitJoiner, return value, as generated by joinees. */
714 void* joinee_retval;
sewardj20917d82002-05-28 01:36:45 +0000715
njn25e49d8e72002-09-23 09:36:25 +0000716 /* If VgTs_WaitJoinee, place to copy the return value to, and
717 the identity of the thread we're waiting for. */
718 void** joiner_thread_return;
719 ThreadId joiner_jee_tid;
sewardj8ad94e12002-05-29 00:10:20 +0000720
jsgf855d93d2003-10-13 22:26:55 +0000721 /* If VgTs_WaitSys, this is the result of the pre-syscall check */
722 void *sys_pre_res;
723
724 /* If VgTs_WaitSys, this is the syscall we're currently running */
725 Int syscallno;
726
727 /* Details about this thread's proxy LWP */
728 ProxyLWP *proxy;
729
njn25e49d8e72002-09-23 09:36:25 +0000730 /* Whether or not detached. */
731 Bool detached;
sewardj20917d82002-05-28 01:36:45 +0000732
njn25e49d8e72002-09-23 09:36:25 +0000733 /* Cancelability state and type. */
734 Bool cancel_st; /* False==PTH_CANCEL_DISABLE; True==.._ENABLE */
735 Bool cancel_ty; /* False==PTH_CANC_ASYNCH; True==..._DEFERRED */
736
737 /* Pointer to fn to call to do cancellation. Indicates whether
738 or not cancellation is pending. If NULL, not pending. Else
739 should be &thread_exit_wrapper(), indicating that
740 cancallation is pending. */
741 void (*cancel_pend)(void*);
sewardj2e93c502002-04-12 11:12:52 +0000742
njn25e49d8e72002-09-23 09:36:25 +0000743 /* The cleanup stack. */
744 Int custack_used;
745 CleanupEntry custack[VG_N_CLEANUPSTACK];
sewardj5f07b662002-04-23 16:52:51 +0000746
sewardj00a66b12002-10-12 16:42:35 +0000747 /* A pointer to the thread's-specific-data. This is handled almost
748 entirely from vg_libpthread.c. We just provide hooks to get and
749 set this ptr. This is either NULL, indicating the thread has
750 read/written none of its specifics so far, OR points to a
751 void*[VG_N_THREAD_KEYS], allocated and deallocated in
752 vg_libpthread.c. */
753 void** specifics_ptr;
sewardjb48e5002002-05-13 00:16:03 +0000754
njn25e49d8e72002-09-23 09:36:25 +0000755 /* This thread's blocked-signals mask. Semantics is that for a
756 signal to be delivered to this thread, the signal must not be
jsgf855d93d2003-10-13 22:26:55 +0000757 blocked by this signal mask. If more than one thread accepts a
758 signal, then it will be delivered to one at random. If all
759 threads block the signal, it will remain pending until either a
760 thread unblocks it or someone uses sigwaitsig/sigtimedwait.
761
762 sig_mask reflects what the client told us its signal mask should
763 be, but isn't necessarily the current signal mask of the proxy
764 LWP: it may have more signals blocked because of signal
765 handling, or it may be different because of sigsuspend.
766 */
njn25e49d8e72002-09-23 09:36:25 +0000767 vki_ksigset_t sig_mask;
sewardjb48e5002002-05-13 00:16:03 +0000768
jsgf855d93d2003-10-13 22:26:55 +0000769 /* Effective signal mask. This is the mask which is currently
770 applying; it may be different from sig_mask while a signal
771 handler is running.
772 */
773 vki_ksigset_t eff_sig_mask;
sewardj2e93c502002-04-12 11:12:52 +0000774
njn25e49d8e72002-09-23 09:36:25 +0000775 /* Stacks. When a thread slot is freed, we don't deallocate its
776 stack; we just leave it lying around for the next use of the
777 slot. If the next use of the slot requires a larger stack,
778 only then is the old one deallocated and a new one
779 allocated.
sewardj2e93c502002-04-12 11:12:52 +0000780
njn25e49d8e72002-09-23 09:36:25 +0000781 For the main thread (threadid == 0), this mechanism doesn't
782 apply. We don't know the size of the stack since we didn't
783 allocate it, and furthermore we never reallocate it. */
sewardj2e93c502002-04-12 11:12:52 +0000784
njn25e49d8e72002-09-23 09:36:25 +0000785 /* The allocated size of this thread's stack (permanently zero
786 if this is ThreadId == 0, since we didn't allocate its stack) */
787 UInt stack_size;
sewardj1e8cdc92002-04-18 11:37:52 +0000788
njn25e49d8e72002-09-23 09:36:25 +0000789 /* Address of the lowest word in this thread's stack. NULL means
790 not allocated yet.
791 */
792 Addr stack_base;
sewardj2e93c502002-04-12 11:12:52 +0000793
sewardj92a59562002-09-30 00:53:10 +0000794 /* Address of the highest legitimate word in this stack. This is
795 used for error messages only -- not critical for execution
796 correctness. Is is set for all stacks, specifically including
797 ThreadId == 0 (the main thread). */
njn25e49d8e72002-09-23 09:36:25 +0000798 Addr stack_highest_word;
799
sewardj92a59562002-09-30 00:53:10 +0000800 /* Pointer to this thread's Local (Segment) Descriptor Table.
801 Starts out as NULL, indicating there is no table, and we hope to
802 keep it that way. If the thread does __NR_modify_ldt to create
803 entries, we allocate a 8192-entry table at that point. This is
804 a straight copy of the Linux kernel's scheme. Don't forget to
805 deallocate this at thread exit. */
806 VgLdtEntry* ldt;
807
808 /* Saved machine context. Note the FPU state, %EIP and segment
809 registers are not shadowed.
810
811 Although the segment registers are 16 bits long, storage
812 management here, in VG_(baseBlock) and in VG_(m_state_static) is
813 simplified if we pretend they are 32 bits. */
814 UInt m_cs;
815 UInt m_ss;
816 UInt m_ds;
817 UInt m_es;
818 UInt m_fs;
819 UInt m_gs;
820
njn25e49d8e72002-09-23 09:36:25 +0000821 UInt m_eax;
822 UInt m_ebx;
823 UInt m_ecx;
824 UInt m_edx;
825 UInt m_esi;
826 UInt m_edi;
827 UInt m_ebp;
828 UInt m_esp;
829 UInt m_eflags;
830 UInt m_eip;
sewardjb91ae7f2003-04-29 23:50:00 +0000831
832 /* The SSE/FPU state. This array does not (necessarily) have the
833 required 16-byte alignment required to get stuff in/out by
834 fxsave/fxrestore. So we have to do it "by hand".
835 */
836 UInt m_sse[VG_SIZE_OF_SSESTATE_W];
njn25e49d8e72002-09-23 09:36:25 +0000837
838 UInt sh_eax;
839 UInt sh_ebx;
840 UInt sh_ecx;
841 UInt sh_edx;
842 UInt sh_esi;
843 UInt sh_edi;
844 UInt sh_ebp;
845 UInt sh_esp;
846 UInt sh_eflags;
njn72718642003-07-24 08:45:32 +0000847}
848ThreadState;
sewardj2e93c502002-04-12 11:12:52 +0000849
850
sewardj018f7622002-05-15 21:13:39 +0000851/* The thread table. */
852extern ThreadState VG_(threads)[VG_N_THREADS];
853
854/* Check that tid is in range and denotes a non-Empty thread. */
sewardjb48e5002002-05-13 00:16:03 +0000855extern Bool VG_(is_valid_tid) ( ThreadId tid );
856
sewardj018f7622002-05-15 21:13:39 +0000857/* Check that tid is in range. */
858extern Bool VG_(is_valid_or_empty_tid) ( ThreadId tid );
859
njn72718642003-07-24 08:45:32 +0000860/* Determine if 'tid' is that of the current running thread (Nb: returns
861 False if no thread is currently running. */
862extern Bool VG_(is_running_thread)(ThreadId tid);
863
jsgf855d93d2003-10-13 22:26:55 +0000864/* Get the ThreadState for a particular thread */
865extern ThreadState *VG_(get_ThreadState)(ThreadId tid);
866
sewardj2e93c502002-04-12 11:12:52 +0000867/* Copy the specified thread's state into VG_(baseBlock) in
868 preparation for running it. */
869extern void VG_(load_thread_state)( ThreadId );
870
871/* Save the specified thread's state back in VG_(baseBlock), and fill
872 VG_(baseBlock) with junk, for sanity-check reasons. */
873extern void VG_(save_thread_state)( ThreadId );
874
sewardj1e8cdc92002-04-18 11:37:52 +0000875/* And for the currently running one, if valid. */
876extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000877
sewardj1e8cdc92002-04-18 11:37:52 +0000878/* Similarly ... */
879extern ThreadId VG_(get_current_tid) ( void );
880
sewardjccef2e62002-05-29 19:26:32 +0000881/* Nuke all threads except tid. */
882extern void VG_(nuke_all_threads_except) ( ThreadId me );
883
jsgf855d93d2003-10-13 22:26:55 +0000884/* Give a hint to the scheduler that it may be a good time to find a
885 new runnable thread. If prefer_sched != VG_INVALID_THREADID, then
886 try to schedule that thread.
887*/
888extern void VG_(need_resched) ( ThreadId prefer_sched );
889
890/* Add a new timeout event for a thread*/
891extern void VG_(add_timeout) ( ThreadId tid, UInt time );
sewardj2e93c502002-04-12 11:12:52 +0000892
893/* Return codes from the scheduler. */
894typedef
sewardj7e87e382002-05-03 19:09:05 +0000895 enum {
896 VgSrc_Deadlock, /* no runnable threads and no prospect of any
897 even if we wait for a long time */
898 VgSrc_ExitSyscall, /* client called exit(). This is the normal
899 route out. */
jsgf855d93d2003-10-13 22:26:55 +0000900 VgSrc_BbsDone, /* In a debugging run, the specified number of
sewardj7e87e382002-05-03 19:09:05 +0000901 bbs has been completed. */
jsgf855d93d2003-10-13 22:26:55 +0000902 VgSrc_FatalSig /* Killed by the default action of a fatal
903 signal */
sewardj7e87e382002-05-03 19:09:05 +0000904 }
sewardj2e93c502002-04-12 11:12:52 +0000905 VgSchedReturnCode;
906
sewardj7e87e382002-05-03 19:09:05 +0000907
sewardj2e93c502002-04-12 11:12:52 +0000908/* The scheduler. */
909extern VgSchedReturnCode VG_(scheduler) ( void );
910
911extern void VG_(scheduler_init) ( void );
912
sewardj15a43e12002-04-17 19:35:12 +0000913extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000914
915/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
916extern jmp_buf VG_(scheduler_jmpbuf);
sewardj872051c2002-07-13 12:12:56 +0000917/* This says whether scheduler_jmpbuf is actually valid. Needed so
918 that our signal handler doesn't longjmp when the buffer isn't
919 actually valid. */
920extern Bool VG_(scheduler_jmpbuf_valid);
sewardj2e93c502002-04-12 11:12:52 +0000921/* ... and if so, here's the signal which caused it to do so. */
922extern Int VG_(longjmpd_on_signal);
923
924
sewardj2e93c502002-04-12 11:12:52 +0000925/* The red-zone size which we put at the bottom (highest address) of
926 thread stacks, for paranoia reasons. This can be arbitrary, and
927 doesn't really need to be set at compile time. */
928#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
929
930#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
931 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
932
njn25e49d8e72002-09-23 09:36:25 +0000933/* Junk to fill up a thread's shadow regs with when shadow regs aren't
njnd3040452003-05-19 15:04:06 +0000934 being used. */
njn25e49d8e72002-09-23 09:36:25 +0000935#define VG_UNUSED_SHADOW_REG_VALUE 0x27182818
njnd3040452003-05-19 15:04:06 +0000936/* For sanity checking: if this ends up in a thread's shadow regs when
937 shadow regs aren't being used, something went wrong. */
938#define VG_USED_SHADOW_REG_VALUE 0x31415927
njn25e49d8e72002-09-23 09:36:25 +0000939
njnd3040452003-05-19 15:04:06 +0000940/* Write a value to a client's thread register, and shadow (if necessary) */
941#define SET_THREAD_REG( zztid, zzval, zzreg, zzREG, zzevent, zzargs... ) \
942 do { VG_(threads)[zztid].m_##zzreg = (zzval); \
943 VG_TRACK( zzevent, zztid, R_##zzREG, ##zzargs ); \
sewardj018f7622002-05-15 21:13:39 +0000944 } while (0)
945
njnd3040452003-05-19 15:04:06 +0000946#define SET_SYSCALL_RETVAL(zztid, zzval) \
947 SET_THREAD_REG(zztid, zzval, eax, EAX, post_reg_write_syscall_return)
948
949#define SET_SIGNAL_EDX(zztid, zzval) \
950 SET_THREAD_REG(zztid, zzval, edx, EDX, post_reg_write_deliver_signal)
951
952#define SET_SIGNAL_ESP(zztid, zzval) \
953 SET_THREAD_REG(zztid, zzval, esp, ESP, post_reg_write_deliver_signal)
954
955#define SET_CLREQ_RETVAL(zztid, zzval) \
956 SET_THREAD_REG(zztid, zzval, edx, EDX, post_reg_write_clientreq_return)
957
958#define SET_CLCALL_RETVAL(zztid, zzval, f) \
959 SET_THREAD_REG(zztid, zzval, edx, EDX, post_reg_write_clientcall_return, f)
960
961#define SET_PTHREQ_ESP(zztid, zzval) \
962 SET_THREAD_REG(zztid, zzval, esp, ESP, post_reg_write_pthread_return)
963
964#define SET_PTHREQ_RETVAL(zztid, zzval) \
965 SET_THREAD_REG(zztid, zzval, edx, EDX, post_reg_write_pthread_return)
sewardj018f7622002-05-15 21:13:39 +0000966
sewardj2e93c502002-04-12 11:12:52 +0000967
sewardjd8acdf22002-11-13 21:57:52 +0000968/* This is or'd into a pthread mutex's __m_kind field if it is used
969 before Valgrind is up and running (prehistory). This is used so
970 that if some early code (like the dynamic linker) takes a lock
971 before Valgrind starts and then releases it afterwards, we can work
972 out what's happening. */
973#define VG_PTHREAD_PREHISTORY 0x80000000
974
sewardj2e93c502002-04-12 11:12:52 +0000975/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000976 Exports of vg_signals.c
977 ------------------------------------------------------------------ */
978
jsgf855d93d2003-10-13 22:26:55 +0000979extern Bool VG_(do_signal_routing); /* whether scheduler LWP has to route signals */
980
981/* RT signal allocation */
982extern Int VG_(sig_rtmin);
983extern Int VG_(sig_rtmax);
984extern Int VG_(sig_alloc_rtsig) ( Int high );
985
sewardjde4a1d02002-03-22 01:27:54 +0000986extern void VG_(sigstartup_actions) ( void );
sewardj839299f2003-06-14 11:57:59 +0000987extern void VG_(sigshutdown_actions) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000988
jsgf855d93d2003-10-13 22:26:55 +0000989extern void VG_(deliver_signal) ( ThreadId tid, const vki_ksiginfo_t *, Bool async );
sewardjde4a1d02002-03-22 01:27:54 +0000990extern void VG_(unblock_host_signal) ( Int sigNo );
sewardj018f7622002-05-15 21:13:39 +0000991extern void VG_(handle_SCSS_change) ( Bool force_update );
992
jsgf855d93d2003-10-13 22:26:55 +0000993extern Bool VG_(is_sig_ign) ( Int sigNo );
994
995/* Route pending signals from the scheduler LWP to the appropriate
996 thread LWP. */
997extern void VG_(route_signals) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000998
999/* Fake system calls for signal handling. */
sewardj2342c972002-05-22 23:34:20 +00001000extern void VG_(do__NR_sigaltstack) ( ThreadId tid );
sewardj2e93c502002-04-12 11:12:52 +00001001extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardj018f7622002-05-15 21:13:39 +00001002extern void VG_(do__NR_sigprocmask) ( ThreadId tid,
1003 Int how,
1004 vki_ksigset_t* set,
1005 vki_ksigset_t* oldset );
1006extern void VG_(do_pthread_sigmask_SCSS_upd) ( ThreadId tid,
1007 Int how,
1008 vki_ksigset_t* set,
1009 vki_ksigset_t* oldset );
1010extern void VG_(send_signal_to_thread) ( ThreadId thread,
1011 Int signo );
sewardjde4a1d02002-03-22 01:27:54 +00001012
sewardjefbfcdf2002-06-19 17:35:45 +00001013extern void VG_(do_sigpending) ( ThreadId tid, vki_ksigset_t* set );
1014
1015
sewardj2e93c502002-04-12 11:12:52 +00001016/* Modify the current thread's state once we have detected it is
1017 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +00001018extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +00001019
sewardj2e93c502002-04-12 11:12:52 +00001020/* Handy utilities to block/restore all host signals. */
1021extern void VG_(block_all_host_signals)
1022 ( /* OUT */ vki_ksigset_t* saved_mask );
sewardj018f7622002-05-15 21:13:39 +00001023extern void VG_(restore_all_host_signals)
sewardj2e93c502002-04-12 11:12:52 +00001024 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +00001025
jsgf855d93d2003-10-13 22:26:55 +00001026extern vki_ksiginfo_t VG_(unresumable_siginfo);
1027
1028extern void VG_(kill_self)(Int sigNo);
1029
sewardjde4a1d02002-03-22 01:27:54 +00001030/* ---------------------------------------------------------------------
1031 Exports of vg_mylibc.c
1032 ------------------------------------------------------------------ */
1033
njne427a662002-10-02 11:08:25 +00001034#define vg_assert(expr) \
1035 ((void) ((expr) ? 0 : \
1036 (VG_(core_assert_fail) (VG__STRING(expr), \
1037 __FILE__, __LINE__, \
1038 __PRETTY_FUNCTION__), 0)))
1039__attribute__ ((__noreturn__))
daywalker3222e0a2003-09-18 01:39:50 +00001040extern void VG_(core_assert_fail) ( const Char* expr, const Char* file,
1041 Int line, const Char* fn );
njne427a662002-10-02 11:08:25 +00001042__attribute__ ((__noreturn__))
1043extern void VG_(core_panic) ( Char* str );
sewardjde4a1d02002-03-22 01:27:54 +00001044
njn25e49d8e72002-09-23 09:36:25 +00001045/* VG_(brk) not public so skins cannot screw with curr_dataseg_end */
1046extern void* VG_(brk) ( void* end_data_segment );
sewardjde4a1d02002-03-22 01:27:54 +00001047
njn25e49d8e72002-09-23 09:36:25 +00001048/* Skins use VG_(strdup)() which doesn't expose ArenaId */
1049extern Char* VG_(arena_strdup) ( ArenaId aid, const Char* s);
sewardjde4a1d02002-03-22 01:27:54 +00001050
njn25e49d8e72002-09-23 09:36:25 +00001051/* Skins shouldn't need these...(?) */
sewardj5f07b662002-04-23 16:52:51 +00001052extern void VG_(start_rdtsc_calibration) ( void );
1053extern void VG_(end_rdtsc_calibration) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001054
njn25e49d8e72002-09-23 09:36:25 +00001055extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
sewardj2e93c502002-04-12 11:12:52 +00001056extern Int VG_(select)( Int n,
1057 vki_fd_set* readfds,
1058 vki_fd_set* writefds,
1059 vki_fd_set* exceptfds,
1060 struct vki_timeval * timeout );
jsgf855d93d2003-10-13 22:26:55 +00001061extern Int VG_(poll)( struct vki_pollfd *, UInt nfds, Int timeout);
sewardj2e93c502002-04-12 11:12:52 +00001062extern Int VG_(nanosleep)( const struct vki_timespec *req,
1063 struct vki_timespec *rem );
1064
fitzhardinge98abfc72003-12-16 02:05:15 +00001065/* system/mman.h */
1066extern void* VG_(mmap)( void* start, UInt length,
1067 UInt prot, UInt flags, UInt fd, UInt offset );
1068extern Int VG_(munmap)( void* start, Int length );
1069extern Int VG_(mprotect)( void *start, Int length, UInt prot );
1070
1071
jsgf855d93d2003-10-13 22:26:55 +00001072/* Move an fd into the Valgrind-safe range */
1073Int VG_(safe_fd)(Int oldfd);
1074
sewardj570f8902002-11-03 11:44:36 +00001075extern Int VG_(write_socket)( Int sd, void *msg, Int count );
sewardj73cf3bc2002-11-03 03:20:15 +00001076
1077/* --- Connecting over the network --- */
1078extern Int VG_(connect_via_socket)( UChar* str );
1079
fitzhardinge98abfc72003-12-16 02:05:15 +00001080/* Environment manipulations */
1081extern Char* VG_(env_getenv) ( Char **env, Char* varname );
1082extern Char **VG_(env_setenv) ( Char ***envp, const Char* varname, const Char *val );
1083extern void VG_(env_unsetenv) ( Char **env, const Char *varname );
sewardj570f8902002-11-03 11:44:36 +00001084
1085/* ---------------------------------------------------------------------
1086 Exports of vg_message.c
1087 ------------------------------------------------------------------ */
1088
1089/* Low-level -- send bytes directly to the message sink. Do not
1090 use. */
1091extern void VG_(send_bytes_to_logging_sink) ( Char* msg, Int nbytes );
1092
1093
sewardjde4a1d02002-03-22 01:27:54 +00001094/* ---------------------------------------------------------------------
1095 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
1096 vg_from_ucode.c).
1097 ------------------------------------------------------------------ */
1098
sewardjde4a1d02002-03-22 01:27:54 +00001099#define VG_IS_FLAG_SUBSET(set1,set2) \
1100 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
1101
1102#define VG_UNION_FLAG_SETS(set1,set2) \
1103 ( ((FlagSet)set1) | ((FlagSet)set2) )
1104
sewardjde4a1d02002-03-22 01:27:54 +00001105/* ---------------------------------------------------------------------
1106 Exports of vg_demangle.c
1107 ------------------------------------------------------------------ */
1108
1109extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
1110
sewardjde4a1d02002-03-22 01:27:54 +00001111/* ---------------------------------------------------------------------
1112 Exports of vg_from_ucode.c
1113 ------------------------------------------------------------------ */
1114
sewardj22854b92002-11-30 14:00:47 +00001115extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes, UShort jumps[VG_MAX_JUMPS] );
sewardjde4a1d02002-03-22 01:27:54 +00001116
njn25e49d8e72002-09-23 09:36:25 +00001117extern void VG_(print_ccall_stats) ( void );
1118extern void VG_(print_UInstr_histogram) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001119
sewardj22854b92002-11-30 14:00:47 +00001120extern void VG_(unchain_jumpsite) ( Addr jumpsite );
1121extern Addr VG_(get_jmp_dest) ( Addr jumpsite );
1122extern Bool VG_(is_unchained_jumpsite) ( Addr jumpsite );
1123extern Bool VG_(is_chained_jumpsite) ( Addr jumpsite );
1124
sewardjde4a1d02002-03-22 01:27:54 +00001125/* ---------------------------------------------------------------------
1126 Exports of vg_to_ucode.c
1127 ------------------------------------------------------------------ */
1128
1129extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
sewardjde4a1d02002-03-22 01:27:54 +00001130
1131/* ---------------------------------------------------------------------
1132 Exports of vg_translate.c
1133 ------------------------------------------------------------------ */
1134
njn810086f2002-11-14 12:42:47 +00001135/* Expandable arrays of uinstrs. */
1136struct _UCodeBlock {
sewardj22854b92002-11-30 14:00:47 +00001137 Addr orig_eip;
njn810086f2002-11-14 12:42:47 +00001138 Int used;
1139 Int size;
1140 UInstr* instrs;
1141 Int nextTemp;
1142};
1143
1144extern UCodeBlock* VG_(alloc_UCodeBlock) ( void );
1145
njn72718642003-07-24 08:45:32 +00001146extern void VG_(translate) ( ThreadId tid,
sewardj1e8cdc92002-04-18 11:37:52 +00001147 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001148 UInt* orig_size,
1149 Addr* trans_addr,
sewardj22854b92002-11-30 14:00:47 +00001150 UInt* trans_size,
1151 UShort jumps[VG_MAX_JUMPS]);
sewardjde4a1d02002-03-22 01:27:54 +00001152
njn25e49d8e72002-09-23 09:36:25 +00001153extern Bool VG_(saneUInstr) ( Bool beforeRA, Bool beforeLiveness,
1154 UInstr* u );
1155extern void VG_(saneUCodeBlock) ( UCodeBlock* cb );
1156extern Bool VG_(saneUCodeBlockCalls) ( UCodeBlock* cb );
sewardjde4a1d02002-03-22 01:27:54 +00001157
sewardjb5ff83e2002-12-01 19:40:49 +00001158
sewardjde4a1d02002-03-22 01:27:54 +00001159/* ---------------------------------------------------------------------
1160 Exports of vg_execontext.c.
1161 ------------------------------------------------------------------ */
1162
1163/* Records the PC and a bit of the call chain. The first 4 %eip
1164 values are used in comparisons do remove duplicate errors, and for
1165 comparing against suppression specifications. The rest are purely
1166 informational (but often important). */
1167
njn25e49d8e72002-09-23 09:36:25 +00001168struct _ExeContext {
1169 struct _ExeContext * next;
1170 /* Variable-length array. The size is VG_(clo_backtrace_size); at
njn6c846552003-09-16 07:41:43 +00001171 least 1, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
njn25e49d8e72002-09-23 09:36:25 +00001172 [1] is its caller, [2] is the caller of [1], etc. */
1173 Addr eips[0];
1174};
sewardjde4a1d02002-03-22 01:27:54 +00001175
1176
sewardjde4a1d02002-03-22 01:27:54 +00001177/* Print stats (informational only). */
1178extern void VG_(show_ExeContext_stats) ( void );
1179
njn25e49d8e72002-09-23 09:36:25 +00001180/* Like VG_(get_ExeContext), but with a slightly different type */
1181extern ExeContext* VG_(get_ExeContext2) ( Addr eip, Addr ebp,
1182 Addr ebp_min, Addr ebp_max );
sewardjde4a1d02002-03-22 01:27:54 +00001183
1184
1185/* ---------------------------------------------------------------------
1186 Exports of vg_errcontext.c.
1187 ------------------------------------------------------------------ */
1188
njn25e49d8e72002-09-23 09:36:25 +00001189/* Note: it is imperative this doesn't overlap with (0..) at all, as skins
1190 * effectively extend it by defining their own enums in the (0..) range. */
sewardjde4a1d02002-03-22 01:27:54 +00001191typedef
njn25e49d8e72002-09-23 09:36:25 +00001192 enum {
1193 PThreadSupp = -1, /* Matches PThreadErr */
sewardjde4a1d02002-03-22 01:27:54 +00001194 }
njn25e49d8e72002-09-23 09:36:25 +00001195 CoreSuppKind;
1196
1197/* For each caller specified for a suppression, record the nature of
1198 the caller name. Not of interest to skins. */
1199typedef
1200 enum {
1201 ObjName, /* Name is of an shared object file. */
1202 FunName /* Name is of a function. */
1203 }
1204 SuppLocTy;
1205
njn810086f2002-11-14 12:42:47 +00001206/* Suppressions. Skins can get/set skin-relevant parts with functions
1207 declared in include/vg_skin.h. Extensible via the 'extra' field.
1208 Skins can use a normal enum (with element values in the normal range
1209 (0..)) for `skind'. */
1210struct _Supp {
1211 struct _Supp* next;
1212 /* The number of times this error has been suppressed. */
1213 Int count;
1214 /* The name by which the suppression is referred to. */
1215 Char* sname;
1216 /* First two (name of fn where err occurs, and immediate caller)
1217 * are mandatory; extra two are optional. */
1218 SuppLocTy caller_ty[VG_N_SUPP_CALLERS];
1219 Char* caller [VG_N_SUPP_CALLERS];
1220
1221 /* The skin-specific part */
1222 /* What kind of suppression. Must use the range (0..) */
1223 SuppKind skind;
1224 /* String -- use is optional. NULL by default. */
1225 Char* string;
1226 /* Anything else -- use is optional. NULL by default. */
1227 void* extra;
1228};
njn25e49d8e72002-09-23 09:36:25 +00001229
1230/* Note: it is imperative this doesn't overlap with (0..) at all, as skins
1231 * effectively extend it by defining their own enums in the (0..) range. */
1232typedef
1233 enum {
1234 PThreadErr = -1, /* Pthreading error */
1235 }
1236 CoreErrorKind;
1237
njn810086f2002-11-14 12:42:47 +00001238/* Errors. Extensible (via the 'extra' field). Skins can use a normal
1239 enum (with element values in the normal range (0..)) for `ekind'.
1240 Functions for getting/setting the skin-relevant fields are in
1241 include/vg_skin.h.
1242
1243 When errors are found and recorded with VG_(maybe_record_error)(), all
1244 the skin must do is pass in the four parameters; core will
1245 allocate/initialise the error record.
1246*/
1247struct _Error {
1248 struct _Error* next;
1249 /* NULL if unsuppressed; or ptr to suppression record. */
1250 Supp* supp;
1251 Int count;
njn810086f2002-11-14 12:42:47 +00001252 ThreadId tid;
njn810086f2002-11-14 12:42:47 +00001253
1254 /* The skin-specific part */
njnae17bec2003-01-28 19:59:38 +00001255 /* Initialised by core */
1256 ExeContext* where;
njn810086f2002-11-14 12:42:47 +00001257 /* Used by ALL. Must be in the range (0..) */
1258 Int ekind;
1259 /* Used frequently */
1260 Addr addr;
1261 /* Used frequently */
1262 Char* string;
1263 /* For any skin-specific extras */
1264 void* extra;
1265};
sewardjde4a1d02002-03-22 01:27:54 +00001266
1267
njn25e49d8e72002-09-23 09:36:25 +00001268extern void VG_(load_suppressions) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001269
njn25e49d8e72002-09-23 09:36:25 +00001270extern void VG_(record_pthread_error) ( ThreadId tid, Char* msg );
sewardjde4a1d02002-03-22 01:27:54 +00001271
njn25e49d8e72002-09-23 09:36:25 +00001272extern void VG_(show_all_errors) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001273
njn43c799e2003-04-08 00:08:52 +00001274extern Bool VG_(is_action_requested) ( Char* action, Bool* clo );
1275
1276extern void VG_(gen_suppression) ( Error* err );
sewardj99aac972002-12-26 01:53:45 +00001277
njn47363ab2003-04-21 13:24:40 +00001278extern UInt VG_(n_errs_found);
1279
sewardjde4a1d02002-03-22 01:27:54 +00001280/* ---------------------------------------------------------------------
1281 Exports of vg_procselfmaps.c
1282 ------------------------------------------------------------------ */
1283
njnfa1016e2003-09-25 17:54:11 +00001284/* Reads /proc/self/maps into a static buffer which can be parsed by
1285 VG_(parse_procselfmaps)(). */
1286extern void VG_(read_procselfmaps) ( void );
njn3e884182003-04-15 13:03:23 +00001287
1288/* Parses /proc/self/maps, calling `record_mapping' for each entry. If
1289 `read_from_file' is True, /proc/self/maps is read directly, otherwise
1290 it's read from the buffer filled by VG_(read_procselfmaps_contents)(). */
sewardjde4a1d02002-03-22 01:27:54 +00001291extern
njnfa1016e2003-09-25 17:54:11 +00001292void VG_(parse_procselfmaps) (
fitzhardinge98abfc72003-12-16 02:05:15 +00001293 void (*record_mapping)( Addr addr, UInt len, Char rr, Char ww, Char xx,
1294 UInt dev, UInt ino, ULong foff, const UChar *filename )
sewardjde4a1d02002-03-22 01:27:54 +00001295);
1296
1297
1298/* ---------------------------------------------------------------------
1299 Exports of vg_symtab2.c
1300 ------------------------------------------------------------------ */
1301
fitzhardinge98abfc72003-12-16 02:05:15 +00001302typedef struct _Segment Segment;
1303
1304extern Bool VG_(is_object_file) ( const void *hdr );
njnfa1016e2003-09-25 17:54:11 +00001305extern void VG_(mini_stack_dump) ( Addr eips[], UInt n_eips );
fitzhardinge98abfc72003-12-16 02:05:15 +00001306extern SegInfo * VG_(read_seg_symbols) ( Segment *seg );
njnfa1016e2003-09-25 17:54:11 +00001307extern void VG_(unload_symbols) ( Addr start, UInt length );
fitzhardinge98abfc72003-12-16 02:05:15 +00001308extern void VG_(symtab_incref) ( SegInfo * );
1309extern void VG_(symtab_decref) ( SegInfo *, Addr a, UInt len );
sewardjde4a1d02002-03-22 01:27:54 +00001310
njn25e49d8e72002-09-23 09:36:25 +00001311extern Bool VG_(get_fnname_nodemangle)( Addr a, Char* fnname, Int n_fnname );
sewardj25c7c3a2003-07-10 00:17:58 +00001312
fitzhardinge98abfc72003-12-16 02:05:15 +00001313/* Set up some default redirects */
1314extern void VG_(setup_code_redirect_table) ( void );
sewardj25c7c3a2003-07-10 00:17:58 +00001315
fitzhardinge98abfc72003-12-16 02:05:15 +00001316/* Redirection machinery */
1317extern void VG_(add_redirect_sym)(const Char *from_lib, const Char *from_sym,
1318 const Char *to_lib, const Char *to_sym);
1319extern void VG_(add_redirect_addr)(const Char *from_lib, const Char *from_sym,
1320 Addr to_addr);
1321extern Addr VG_(code_redirect) (Addr orig);
sewardjde4a1d02002-03-22 01:27:54 +00001322
1323/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +00001324 Exports of vg_main.c
1325 ------------------------------------------------------------------ */
1326
fitzhardinge98abfc72003-12-16 02:05:15 +00001327/* structure used for transporting values from stage2 into Valgrind
1328 proper */
1329typedef struct {
1330 Addr client_esp; /* initial client ESP */
1331 Addr client_eip; /* initial client EIP */
1332 Char **client_envp; /* client envp */
1333 UInt *client_auxv; /* client auxv */
1334 Addr client_brkbase; /* initial value of brk */
1335
1336 Int argc; /* Valgrind's argc/argv */
1337 Char **argv;
1338 const Char *libdir; /* library directory */
1339
fitzhardingea49f9b52003-12-16 22:26:45 +00001340 Int vgexecfd; /* fd of our own (stage1) executable */
1341 Int clexecfd; /* fd of the client executable */
fitzhardinge98abfc72003-12-16 02:05:15 +00001342
1343 Addr client_base; /* start of client address space */
1344 Addr client_end; /* end of client address space */
1345 Addr client_mapbase; /* base address of !MAP_FIXED mappings */
1346 Addr shadow_base; /* start of skin's shadow memory */
1347 Addr shadow_end; /* end of skin's shadow memory */
1348 Addr vg_base; /* start of Valgrind's memory */
1349 Addr vg_mmap_end; /* end of Valgrind's mmap area */
1350 Addr vg_end; /* end of Valgrind's memory */
1351 Addr clstk_base; /* lowest address of client stack */
1352 Addr clstk_end; /* highest address of client stack */
1353} KickstartParams;
1354
1355/* Entrypoint for kickstart */
1356typedef void (kickstart_main_t)(const KickstartParams *kp,
1357 void (*tool_init)(void), void *tool_dlhandle);
1358extern kickstart_main_t VG_(main);
1359
1360extern void VG_(usage)(void);
1361
sewardjb91ae7f2003-04-29 23:50:00 +00001362/* Is this a SSE/SSE2-capable CPU? If so, we had better save/restore
1363 the SSE state all over the place. This is set up very early, in
1364 vg_startup.S. We have to determine it early since we can't even
1365 correctly snapshot the startup machine state without it. */
1366extern Bool VG_(have_ssestate);
1367
sewardj73cf3bc2002-11-03 03:20:15 +00001368/* Tell the logging mechanism whether we are logging to a file
1369 descriptor or a socket descriptor. */
1370extern Bool VG_(logging_to_filedes);
1371
njn25e49d8e72002-09-23 09:36:25 +00001372/* Sanity checks which may be done at any time. The scheduler decides when. */
1373extern void VG_(do_sanity_checks) ( Bool force_expensive );
1374
fitzhardinge98abfc72003-12-16 02:05:15 +00001375/* Address space */
1376extern Addr VG_(client_base); /* client address space limits */
1377extern Addr VG_(client_end);
1378extern Addr VG_(client_mapbase); /* base of mappings */
1379extern Addr VG_(clstk_base); /* client stack range */
1380extern Addr VG_(clstk_end);
1381extern Addr VG_(brk_base); /* start of brk */
1382extern Addr VG_(brk_limit); /* current brk */
1383extern Addr VG_(shadow_base); /* skin's shadow memory */
1384extern Addr VG_(shadow_end);
1385extern Addr VG_(valgrind_base); /* valgrind's address range */
1386extern Addr VG_(valgrind_mmap_end);
1387extern Addr VG_(valgrind_end);
1388
1389/* stage1 executable file descriptor */
fitzhardingea49f9b52003-12-16 22:26:45 +00001390extern Int VG_(vgexecfd);
1391
1392/* client executable file descriptor */
1393extern Int VG_(clexecfd);
fitzhardinge98abfc72003-12-16 02:05:15 +00001394
1395/* Path to all our library/aux files */
1396extern const Char *VG_(libdir);
1397
sewardjde4a1d02002-03-22 01:27:54 +00001398/* A structure used as an intermediary when passing the simulated
1399 CPU's state to some assembly fragments, particularly system calls.
1400 Stuff is copied from baseBlock to here, the assembly magic runs,
sewardjb91ae7f2003-04-29 23:50:00 +00001401 and then the inverse copy is done. Alignment: the SSE state must
1402 be 16-byte aligned. We ask for the whole struct to be 16-byte
1403 aligned, and the SSE state starts at the 6+8+1+1th == 16th word,
1404 so it too must be 16-byte aligned. Consequence: change this struct
1405 only _very carefully_ ! See also above comment re masking MXCSR.
1406*/
1407__attribute__ ((aligned (16)))
sewardj92a59562002-09-30 00:53:10 +00001408extern UInt VG_(m_state_static) [6 /* segment regs, Intel order */
1409 + 8 /* int regs, in Intel order */
sewardjde4a1d02002-03-22 01:27:54 +00001410 + 1 /* %eflags */
1411 + 1 /* %eip */
sewardjb91ae7f2003-04-29 23:50:00 +00001412 + VG_SIZE_OF_SSESTATE_W /* SSE state */
sewardjde4a1d02002-03-22 01:27:54 +00001413 ];
1414
1415/* Handy fns for doing the copy back and forth. */
1416extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1417extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1418
njn9b007f62003-04-07 14:40:25 +00001419/* Determine if %esp adjustment must be noted */
njnf4ce3d32003-02-10 10:17:26 +00001420extern Bool VG_(need_to_handle_esp_assignment) ( void );
1421
sewardjde4a1d02002-03-22 01:27:54 +00001422/* Called when some unhandleable client behaviour is detected.
1423 Prints a msg and aborts. */
njn25e49d8e72002-09-23 09:36:25 +00001424extern void VG_(unimplemented) ( Char* msg )
1425 __attribute__((__noreturn__));
sewardjde4a1d02002-03-22 01:27:54 +00001426
njn25e49d8e72002-09-23 09:36:25 +00001427/* Similarly, we have to ask for signals to be delivered on an alternative
1428 stack, since it is possible, although unlikely, that we'll have to run
1429 client code from inside the Valgrind-installed signal handler. If this
1430 happens it will be done by vg_deliver_signal_immediately(). */
njn6eba4ef2003-05-01 08:06:41 +00001431extern UInt VG_(sigstack)[VG_SIGSTACK_SIZE_W];
sewardjde4a1d02002-03-22 01:27:54 +00001432
fitzhardinge98abfc72003-12-16 02:05:15 +00001433/* Valgrind's argc and argv */
1434extern Int VG_(vg_argc);
1435extern Char **VG_(vg_argv);
1436
sewardjde4a1d02002-03-22 01:27:54 +00001437/* Holds client's %esp at the point we gained control. From this the
1438 client's argc, argv and envp are deduced. */
1439extern Addr VG_(esp_at_startup);
sewardjde4a1d02002-03-22 01:27:54 +00001440
sewardjd5815ec2003-04-06 12:23:27 +00001441/* Indicates presence, and holds address of client's sysinfo page, a
1442 feature of some modern kernels used to provide vsyscalls, etc. */
1443extern Bool VG_(sysinfo_page_exists);
1444extern Addr VG_(sysinfo_page_addr);
1445
fitzhardinge98abfc72003-12-16 02:05:15 +00001446/* Walk through a colon separated list variable, removing entries
1447 which match pattern. */
1448extern void VG_(mash_colon_env)(Char *varp, const Char *pattern);
sewardjde4a1d02002-03-22 01:27:54 +00001449
1450/* Something of a function looking for a home ... start up GDB. This
1451 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1452 *client's* stack. This is necessary to give GDB the illusion that
1453 the client program really was running on the real cpu. */
1454extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1455
njn41557122002-10-14 09:25:37 +00001456/* VG_(bbs_done) in include/vg_skin.h */
1457
sewardjde4a1d02002-03-22 01:27:54 +00001458/* 64-bit counter for the number of bbs to go before a debug exit. */
1459extern ULong VG_(bbs_to_go);
1460
1461/* Counts downwards in vg_run_innerloop. */
1462extern UInt VG_(dispatch_ctr);
1463
sewardj7e87e382002-05-03 19:09:05 +00001464/* This is the ThreadId of the last thread the scheduler ran. */
1465extern ThreadId VG_(last_run_tid);
1466
njn25e49d8e72002-09-23 09:36:25 +00001467/* This is the argument to __NR_exit() supplied by the first thread to
1468 call that syscall. We eventually pass that to __NR_exit() for
1469 real. */
njn633de322003-05-12 20:40:13 +00001470extern Int VG_(exitcode);
njn25e49d8e72002-09-23 09:36:25 +00001471
jsgf855d93d2003-10-13 22:26:55 +00001472/* If we're doing the default action of a fatal signal */
1473extern jmp_buf VG_(fatal_signal_jmpbuf);
1474extern Bool VG_(fatal_signal_set); /* jmp_buf is valid */
1475extern Int VG_(fatal_sigNo); /* the fatal signal */
sewardjde4a1d02002-03-22 01:27:54 +00001476
1477/* --- Counters, for informational purposes only. --- */
1478
1479/* Number of lookups which miss the fast tt helper. */
1480extern UInt VG_(tt_fast_misses);
1481
sewardjc0d8f682002-11-30 00:49:43 +00001482/* Counts for TT/TC informational messages. */
sewardjde4a1d02002-03-22 01:27:54 +00001483
sewardjde4a1d02002-03-22 01:27:54 +00001484/* Number and total o/t size of translations overall. */
1485extern UInt VG_(overall_in_count);
1486extern UInt VG_(overall_in_osize);
1487extern UInt VG_(overall_in_tsize);
1488/* Number and total o/t size of discards overall. */
1489extern UInt VG_(overall_out_count);
1490extern UInt VG_(overall_out_osize);
1491extern UInt VG_(overall_out_tsize);
sewardjc0d8f682002-11-30 00:49:43 +00001492/* The number of discards of TT/TC. */
1493extern UInt VG_(number_of_tc_discards);
sewardj22854b92002-11-30 14:00:47 +00001494/* Counts of chain and unchain operations done. */
1495extern UInt VG_(bb_enchain_count);
1496extern UInt VG_(bb_dechain_count);
1497/* Number of unchained jumps performed. */
1498extern UInt VG_(unchained_jumps_done);
1499
sewardjde4a1d02002-03-22 01:27:54 +00001500
1501/* Counts pertaining to the register allocator. */
1502
1503/* total number of uinstrs input to reg-alloc */
1504extern UInt VG_(uinstrs_prealloc);
1505
1506/* total number of uinstrs added due to spill code */
1507extern UInt VG_(uinstrs_spill);
1508
1509/* number of bbs requiring spill code */
1510extern UInt VG_(translations_needing_spill);
1511
1512/* total of register ranks over all translations */
1513extern UInt VG_(total_reg_rank);
1514
sewardjde4a1d02002-03-22 01:27:54 +00001515/* Counts pertaining to internal sanity checking. */
1516extern UInt VG_(sanity_fast_count);
1517extern UInt VG_(sanity_slow_count);
1518
sewardj2e93c502002-04-12 11:12:52 +00001519/* Counts pertaining to the scheduler. */
1520extern UInt VG_(num_scheduling_events_MINOR);
1521extern UInt VG_(num_scheduling_events_MAJOR);
1522
sewardjfa492d42002-12-08 18:20:01 +00001523/* Insert and extract the D flag from eflags */
1524UInt VG_(insertDflag)(UInt eflags, Int d);
1525Int VG_(extractDflag)(UInt eflags);
sewardjde4a1d02002-03-22 01:27:54 +00001526
1527/* ---------------------------------------------------------------------
1528 Exports of vg_memory.c
1529 ------------------------------------------------------------------ */
1530
fitzhardinge98abfc72003-12-16 02:05:15 +00001531/* A Segment is mapped piece of client memory. This covers all kinds
1532 of mapped memory (exe, brk, mmap, .so, shm, stack, etc)
1533
1534 We try to encode everything we know about a particular segment here.
1535*/
1536#define SF_FIXED (1 << 0) /* client asked for MAP_FIXED */
1537#define SF_SHARED (1 << 1) /* shared */
1538#define SF_SHM (1 << 2) /* SYSV SHM (also SF_SHARED) */
1539#define SF_MMAP (1 << 3) /* mmap memory */
1540#define SF_FILE (1 << 4) /* mapping is backed by a file */
1541#define SF_STACK (1 << 5) /* is a stack */
1542#define SF_GROWDOWN (1 << 6) /* segment grows down */
1543#define SF_GROWUP (1 << 7) /* segment grows up */
1544#define SF_EXEC (1 << 8) /* segment created by exec */
1545#define SF_DYNLIB (1 << 9) /* mapped from dynamic library */
1546#define SF_NOSYMS (1 << 10) /* don't load syms, even if present */
1547#define SF_BRK (1 << 11) /* brk segment */
1548#define SF_CORE (1 << 12) /* allocated by core on behalf of the client */
1549#define SF_VALGRIND (1 << 13) /* a valgrind-internal mapping - not in client*/
1550#define SF_CODE (1 << 14) /* segment contains cached code */
1551
1552struct _Segment {
1553 UInt prot; /* VKI_PROT_* */
1554 UInt flags; /* SF_* */
1555
1556 Addr addr; /* mapped addr (page aligned) */
1557 UInt len; /* size of mapping (page aligned) */
1558
1559 /* These are valid if (flags & SF_FILE) */
1560 ULong offset; /* file offset */
1561 const Char *filename; /* filename (NULL if unknown) */
1562 UInt dev; /* device */
1563 UInt ino; /* inode */
1564
1565 SegInfo *symtab; /* symbol table */
1566};
1567
1568/* segment mapped from a file descriptor */
1569extern void VG_(map_fd_segment) (Addr addr, UInt len, UInt prot, UInt flags,
1570 Int fd, ULong off, const Char *filename);
1571
1572/* segment mapped from a file */
1573extern void VG_(map_file_segment)(Addr addr, UInt len, UInt prot, UInt flags,
1574 UInt dev, UInt ino, ULong off, const Char *filename);
1575
1576/* simple segment */
1577extern void VG_(map_segment) (Addr addr, UInt len, UInt prot, UInt flags);
1578
1579extern void VG_(unmap_range) (Addr addr, UInt len);
1580extern void VG_(mprotect_range)(Addr addr, UInt len, UInt prot);
1581extern Addr VG_(find_map_space)(Addr base, UInt len, Bool for_client);
1582
1583extern Segment *VG_(find_segment)(Addr a);
1584extern Segment *VG_(next_segment)(Segment *);
1585
1586extern Bool VG_(seg_contains)(const Segment *s, Addr ptr, UInt size);
1587extern Bool VG_(seg_overlaps)(const Segment *s, Addr ptr, UInt size);
1588
njnfa1016e2003-09-25 17:54:11 +00001589extern void VG_(init_memory) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001590
njn9b007f62003-04-07 14:40:25 +00001591extern __attribute__((regparm(1)))
njnfa1016e2003-09-25 17:54:11 +00001592 void VG_(unknown_esp_update) ( Addr new_ESP );
sewardjde4a1d02002-03-22 01:27:54 +00001593
jsgf855d93d2003-10-13 22:26:55 +00001594/* ---------------------------------------------------------------------
1595 Exports of vg_proxylwp.c
1596 ------------------------------------------------------------------ */
1597
1598/* Issue a syscall for thread tid */
1599extern Int VG_(sys_issue)(int tid);
1600
1601extern void VG_(proxy_init) ( void );
1602extern void VG_(proxy_create) ( ThreadId tid );
1603extern void VG_(proxy_delete) ( ThreadId tid, Bool force );
1604extern void VG_(proxy_results) ( void );
1605extern void VG_(proxy_sendsig) ( ThreadId tid, Int signo );
1606extern void VG_(proxy_setsigmask)(ThreadId tid);
1607extern void VG_(proxy_sigack) ( ThreadId tid, const vki_ksigset_t *);
1608extern void VG_(proxy_abort_syscall) ( ThreadId tid );
1609extern void VG_(proxy_waitsig) ( void );
fitzhardingea09a1b52003-11-07 23:09:48 +00001610extern void VG_(proxy_wait_sys) (ThreadId tid);
jsgf855d93d2003-10-13 22:26:55 +00001611
1612extern void VG_(proxy_shutdown) ( void ); /* shut down the syscall workers */
1613extern Int VG_(proxy_resfd) ( void ); /* FD something can select on to know
1614 a syscall finished */
1615
1616/* Sanity-check the whole proxy-LWP machinery */
1617void VG_(proxy_sanity)(void);
1618
1619/* Send a signal from a thread's proxy to the thread. This longjmps
1620 back into the proxy's main loop, so it doesn't return. */
1621__attribute__ ((__noreturn__))
1622extern void VG_(proxy_handlesig)( const vki_ksiginfo_t *siginfo,
1623 const struct vki_sigcontext *sigcontext );
1624
1625
sewardjde4a1d02002-03-22 01:27:54 +00001626/* ---------------------------------------------------------------------
njn25e49d8e72002-09-23 09:36:25 +00001627 Exports of vg_syscalls.c
sewardjde4a1d02002-03-22 01:27:54 +00001628 ------------------------------------------------------------------ */
1629
fitzhardinge98abfc72003-12-16 02:05:15 +00001630extern Char *VG_(resolve_filename)(Int fd);
njn25e49d8e72002-09-23 09:36:25 +00001631
jsgf855d93d2003-10-13 22:26:55 +00001632extern Bool VG_(pre_syscall) ( ThreadId tid );
1633extern void VG_(post_syscall)( ThreadId tid );
fitzhardingee1c06d82003-10-30 07:21:44 +00001634extern void VG_(restart_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001635
1636extern Bool VG_(is_kerror) ( Int res );
1637
jsgf855d93d2003-10-13 22:26:55 +00001638/* Internal atfork handlers */
1639typedef void (*vg_atfork_t)(ThreadId);
1640extern void VG_(atfork)(vg_atfork_t pre, vg_atfork_t parent, vg_atfork_t child);
sewardjde4a1d02002-03-22 01:27:54 +00001641
rjwalshf5f536f2003-11-17 17:45:00 +00001642/* fd leakage calls. */
1643extern void VG_(init_preopened_fds) ( void );
1644extern void VG_(fd_stats) ( void );
1645
sewardjde4a1d02002-03-22 01:27:54 +00001646/* ---------------------------------------------------------------------
1647 Exports of vg_transtab.c
1648 ------------------------------------------------------------------ */
1649
njn25e49d8e72002-09-23 09:36:25 +00001650/* The fast-cache for tt-lookup. */
1651extern Addr VG_(tt_fast)[VG_TT_FAST_SIZE];
1652
sewardjde4a1d02002-03-22 01:27:54 +00001653extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
sewardj6c3769f2002-11-29 01:02:45 +00001654
sewardjc0d8f682002-11-30 00:49:43 +00001655extern void VG_(add_to_trans_tab) ( Addr orig_addr, Int orig_size,
sewardj22854b92002-11-30 14:00:47 +00001656 Addr trans_addr, Int trans_size,
1657 UShort jumps[VG_MAX_JUMPS]);
sewardj6c3769f2002-11-29 01:02:45 +00001658
sewardj97ad5522003-05-04 12:32:56 +00001659extern void VG_(invalidate_translations) ( Addr start, UInt range, Bool unchain_blocks );
sewardjde4a1d02002-03-22 01:27:54 +00001660
sewardj18d75132002-05-16 11:06:21 +00001661extern void VG_(init_tt_tc) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001662
1663extern void VG_(sanity_check_tc_tt) ( void );
1664extern Addr VG_(search_transtab) ( Addr original_addr );
1665
sewardjde4a1d02002-03-22 01:27:54 +00001666
1667
1668/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +00001669 Exports of vg_syscall.S
1670 ------------------------------------------------------------------ */
1671
jsgf855d93d2003-10-13 22:26:55 +00001672extern Int VG_(do_syscall) ( UInt, ... );
1673extern Int VG_(clone) ( Int (*fn)(void *), void *stack, Int flags, void *arg,
1674 Int *child_tid, Int *parent_tid);
sewardjde4a1d02002-03-22 01:27:54 +00001675
1676/* ---------------------------------------------------------------------
1677 Exports of vg_startup.S
1678 ------------------------------------------------------------------ */
1679
sewardjde4a1d02002-03-22 01:27:54 +00001680extern void VG_(switch_to_real_CPU) ( void );
1681
sewardj35805422002-04-21 13:05:34 +00001682extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1683 Addr m_esp_at_error,
1684 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001685
1686
1687/* ---------------------------------------------------------------------
1688 Exports of vg_dispatch.S
1689 ------------------------------------------------------------------ */
1690
sewardj2e93c502002-04-12 11:12:52 +00001691/* Run a thread for a (very short) while, until some event happens
1692 which means we need to defer to the scheduler. */
1693extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001694
sewardj22854b92002-11-30 14:00:47 +00001695/* The patching routing called when a BB wants to chain itself to
1696 another. */
1697extern UInt VG_(patch_me);
sewardjde4a1d02002-03-22 01:27:54 +00001698
1699/* ---------------------------------------------------------------------
1700 Exports of vg_helpers.S
1701 ------------------------------------------------------------------ */
1702
sewardjde4a1d02002-03-22 01:27:54 +00001703/* Mul, div, etc, -- we don't codegen these directly. */
1704extern void VG_(helper_idiv_64_32);
1705extern void VG_(helper_div_64_32);
1706extern void VG_(helper_idiv_32_16);
1707extern void VG_(helper_div_32_16);
1708extern void VG_(helper_idiv_16_8);
1709extern void VG_(helper_div_16_8);
1710
1711extern void VG_(helper_imul_32_64);
1712extern void VG_(helper_mul_32_64);
1713extern void VG_(helper_imul_16_32);
1714extern void VG_(helper_mul_16_32);
1715extern void VG_(helper_imul_8_16);
1716extern void VG_(helper_mul_8_16);
1717
1718extern void VG_(helper_CLD);
1719extern void VG_(helper_STD);
1720extern void VG_(helper_get_dirflag);
1721
sewardj7d78e782002-06-02 00:04:00 +00001722extern void VG_(helper_CLC);
1723extern void VG_(helper_STC);
1724
sewardjde4a1d02002-03-22 01:27:54 +00001725extern void VG_(helper_shldl);
1726extern void VG_(helper_shldw);
1727extern void VG_(helper_shrdl);
1728extern void VG_(helper_shrdw);
1729
daywalkerb18d2532003-09-27 20:15:01 +00001730extern void VG_(helper_IN);
1731extern void VG_(helper_OUT);
1732
sewardjde4a1d02002-03-22 01:27:54 +00001733extern void VG_(helper_RDTSC);
1734extern void VG_(helper_CPUID);
1735
sewardjde4a1d02002-03-22 01:27:54 +00001736extern void VG_(helper_bsf);
1737extern void VG_(helper_bsr);
1738
1739extern void VG_(helper_fstsw_AX);
1740extern void VG_(helper_SAHF);
njnd6251f12003-06-03 13:38:51 +00001741extern void VG_(helper_LAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001742extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001743extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001744
sewardj51096432002-12-14 23:59:09 +00001745extern void VG_(helper_undefined_instruction);
1746
sewardj20917d82002-05-28 01:36:45 +00001747/* NOT A FUNCTION; this is a bogus RETURN ADDRESS. */
fitzhardinge98abfc72003-12-16 02:05:15 +00001748extern Char VG_(signalreturn_bogusRA);
1749extern Int VG_(signalreturn_bogusRA_length); /* length */
sewardj20917d82002-05-28 01:36:45 +00001750
njn4f9c9342002-04-29 16:03:24 +00001751/* ---------------------------------------------------------------------
njn25e49d8e72002-09-23 09:36:25 +00001752 Things relating to the used skin
njn4f9c9342002-04-29 16:03:24 +00001753 ------------------------------------------------------------------ */
1754
fitzhardinge98abfc72003-12-16 02:05:15 +00001755#define VG_TRACK(fn, args...) \
1756 do { \
1757 if (VG_(defined_##fn)()) \
1758 SK_(fn)(args); \
1759 } while(0)
sewardj18d75132002-05-16 11:06:21 +00001760
fitzhardinge98abfc72003-12-16 02:05:15 +00001761__attribute__ ((noreturn))
1762extern void VG_(missing_tool_func) ( const Char* fn );
sewardj18d75132002-05-16 11:06:21 +00001763
sewardjde4a1d02002-03-22 01:27:54 +00001764/* ---------------------------------------------------------------------
1765 The state of the simulated CPU.
1766 ------------------------------------------------------------------ */
1767
sewardjde4a1d02002-03-22 01:27:54 +00001768/* ---------------------------------------------------------------------
1769 Offsets into baseBlock for everything which needs to referred to
1770 from generated code. The order of these decls does not imply
1771 what the order of the actual offsets is. The latter is important
1772 and is set up in vg_main.c.
1773 ------------------------------------------------------------------ */
1774
1775/* An array of words. In generated code, %ebp always points to the
1776 start of this array. Useful stuff, like the simulated CPU state,
1777 and the addresses of helper functions, can then be found by
1778 indexing off %ebp. The following declares variables which, at
1779 startup time, are given values denoting offsets into baseBlock.
1780 These offsets are in *words* from the start of baseBlock. */
1781
sewardjb91ae7f2003-04-29 23:50:00 +00001782#define VG_BASEBLOCK_WORDS 400
sewardjde4a1d02002-03-22 01:27:54 +00001783
1784extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1785
1786
1787/* -----------------------------------------------------
1788 Read-write parts of baseBlock.
1789 -------------------------------------------------- */
1790
1791/* State of the simulated CPU. */
1792extern Int VGOFF_(m_eax);
1793extern Int VGOFF_(m_ecx);
1794extern Int VGOFF_(m_edx);
1795extern Int VGOFF_(m_ebx);
1796extern Int VGOFF_(m_esp);
1797extern Int VGOFF_(m_ebp);
1798extern Int VGOFF_(m_esi);
1799extern Int VGOFF_(m_edi);
1800extern Int VGOFF_(m_eflags);
sewardjb91ae7f2003-04-29 23:50:00 +00001801extern Int VGOFF_(m_ssestate);
sewardjde4a1d02002-03-22 01:27:54 +00001802extern Int VGOFF_(m_eip);
1803
sewardjfa492d42002-12-08 18:20:01 +00001804extern Int VGOFF_(m_dflag); /* D flag is handled specially */
1805
sewardj92a59562002-09-30 00:53:10 +00001806extern Int VGOFF_(m_cs);
1807extern Int VGOFF_(m_ss);
1808extern Int VGOFF_(m_ds);
1809extern Int VGOFF_(m_es);
1810extern Int VGOFF_(m_fs);
1811extern Int VGOFF_(m_gs);
1812
sewardjde4a1d02002-03-22 01:27:54 +00001813/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1814extern Int VGOFF_(spillslots);
1815
1816/* Records the valid bits for the 8 integer regs & flags reg. */
1817extern Int VGOFF_(sh_eax);
1818extern Int VGOFF_(sh_ecx);
1819extern Int VGOFF_(sh_edx);
1820extern Int VGOFF_(sh_ebx);
1821extern Int VGOFF_(sh_esp);
1822extern Int VGOFF_(sh_ebp);
1823extern Int VGOFF_(sh_esi);
1824extern Int VGOFF_(sh_edi);
1825extern Int VGOFF_(sh_eflags);
1826
sewardjde4a1d02002-03-22 01:27:54 +00001827/* -----------------------------------------------------
1828 Read-only parts of baseBlock.
1829 -------------------------------------------------- */
1830
sewardj92a59562002-09-30 00:53:10 +00001831/* This thread's LDT pointer. */
1832extern Int VGOFF_(ldt);
1833
njn211b6ad2003-02-03 12:33:31 +00001834/* Nb: Most helper offsets are in include/vg_skin.h, for use by skins */
sewardjde4a1d02002-03-22 01:27:54 +00001835
sewardj51096432002-12-14 23:59:09 +00001836extern Int VGOFF_(helper_undefined_instruction);
1837
njn25e49d8e72002-09-23 09:36:25 +00001838/* For storing extension-specific helpers, determined at runtime. The addr
1839 * and offset arrays together form a (addr, offset) map that allows a
1840 * helper's baseBlock offset to be computed from its address. It's done
1841 * like this so CCALL_M_Ns and other helper calls can use the function
1842 * address rather than having to much around with offsets. */
1843extern UInt VG_(n_compact_helpers);
1844extern UInt VG_(n_noncompact_helpers);
1845
1846extern Addr VG_(compact_helper_addrs) [];
1847extern Int VG_(compact_helper_offsets)[];
1848
1849extern Addr VG_(noncompact_helper_addrs) [];
1850extern Int VG_(noncompact_helper_offsets)[];
1851
sewardjde4a1d02002-03-22 01:27:54 +00001852#endif /* ndef __VG_INCLUDE_H */
1853
sewardj3b2736a2002-03-24 12:18:35 +00001854
1855/* ---------------------------------------------------------------------
1856 Finally - autoconf-generated settings
1857 ------------------------------------------------------------------ */
1858
1859#include "config.h"
1860
sewardjde4a1d02002-03-22 01:27:54 +00001861/*--------------------------------------------------------------------*/
1862/*--- end vg_include.h ---*/
1863/*--------------------------------------------------------------------*/