blob: 8dbfa0e396ba335cdf3cd18dd260ee32ce6cf811 [file] [log] [blame]
sewardjde4a1d02002-03-22 01:27:54 +00001
2/*--------------------------------------------------------------------*/
njn717cde52005-05-10 02:47:21 +00003/*--- A header file for various private parts of Valgrind's core. ---*/
rjwalsh7109a8c2004-09-02 00:31:02 +00004/*--- core.h ---*/
sewardjde4a1d02002-03-22 01:27:54 +00005/*--------------------------------------------------------------------*/
6
7/*
njnb9c427c2004-12-01 14:14:42 +00008 This file is part of Valgrind, a dynamic binary instrumentation
9 framework.
sewardjde4a1d02002-03-22 01:27:54 +000010
njn53612422005-03-12 16:22:54 +000011 Copyright (C) 2000-2005 Julian Seward
sewardjde4a1d02002-03-22 01:27:54 +000012 jseward@acm.org
sewardjde4a1d02002-03-22 01:27:54 +000013
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 02111-1307, USA.
28
njn25e49d8e72002-09-23 09:36:25 +000029 The GNU General Public License is contained in the file COPYING.
sewardjde4a1d02002-03-22 01:27:54 +000030*/
31
rjwalsh7109a8c2004-09-02 00:31:02 +000032#ifndef __CORE_H
33#define __CORE_H
sewardjde4a1d02002-03-22 01:27:54 +000034
nethercote13343132004-09-02 15:49:09 +000035#include "tool.h" // tool stuff
nethercotebb4222b2004-09-10 17:42:11 +000036#include "core_arch.h" // arch-specific stuff, eg. x86/core_arch.h
nethercote8ff888f2004-11-17 17:11:45 +000037
sewardjb5f6f512005-03-10 23:59:00 +000038#include "core_os.h" // OS-specific stuff, eg. linux/core_os.h
sewardjde4a1d02002-03-22 01:27:54 +000039
njn278b3d62005-05-30 23:20:51 +000040#include <setjmp.h> // for jmp_buf
njnd01fef72005-03-25 23:35:48 +000041
njn278b3d62005-05-30 23:20:51 +000042#include "pub_core_mallocfree.h" // for type 'ArenaId'
43#include "pub_core_scheduler.h" // for types 'ThreadState', 'ThreadArchState'
44#include "pub_core_stacktrace.h" // for type 'StackTrace'
njn4f6e3702005-05-16 20:50:52 +000045
nethercote7be47252004-09-02 16:02:58 +000046/* ---------------------------------------------------------------------
njn14319cc2005-03-13 06:26:22 +000047 Global macros.
nethercote7be47252004-09-02 16:02:58 +000048 ------------------------------------------------------------------ */
49
sewardjde4a1d02002-03-22 01:27:54 +000050/* Max length of a text fragment used to construct error messages. */
njn47b209a2005-03-25 23:47:16 +000051#define VG_ERRTXT_LEN 4096
sewardjde4a1d02002-03-22 01:27:54 +000052
sewardjde4a1d02002-03-22 01:27:54 +000053/* The maximum number of calls we're prepared to save in a
54 backtrace. */
55#define VG_DEEPEST_BACKTRACE 50
56
fitzhardinge98abfc72003-12-16 02:05:15 +000057/* Useful macros */
58/* a - alignment - must be a power of 2 */
tomde2ec262005-03-29 12:16:10 +000059#define ROUNDDN(p, a) ((Addr)(p) & ~((Addr)(a)-1))
fitzhardinge98abfc72003-12-16 02:05:15 +000060#define ROUNDUP(p, a) ROUNDDN((p)+(a)-1, (a))
nethercote73b526f2004-10-31 18:48:21 +000061#define PGROUNDDN(p) ROUNDDN(p, VKI_PAGE_SIZE)
62#define PGROUNDUP(p) ROUNDUP(p, VKI_PAGE_SIZE)
fitzhardinge98abfc72003-12-16 02:05:15 +000063
sewardj51ac0872004-12-21 01:20:49 +000064
nethercote80013e92004-09-05 20:39:51 +000065/* ---------------------------------------------------------------------
66 Environment variables
67 ------------------------------------------------------------------ */
68
69/* The directory we look for all our auxillary files in */
70#define VALGRINDLIB "VALGRINDLIB"
71
72/* Additional command-line arguments; they are overridden by actual
73 command-line option. Each argument is separated by spaces. There
74 is no quoting mechanism.
75 */
76#define VALGRINDOPTS "VALGRIND_OPTS"
77
78/* If this variable is present in the environment, then valgrind will
79 not parse the command line for options at all; all options come
80 from this variable. Arguments are terminated by ^A (\001). There
81 is no quoting mechanism.
82
83 This variable is not expected to be set by anything other than
84 Valgrind itself, as part of its handling of execve with
85 --trace-children=yes. This variable should not be present in the
86 client environment.
87 */
88#define VALGRINDCLO "_VALGRIND_CLO"
89
fitzhardinge98abfc72003-12-16 02:05:15 +000090
thughesad1c9562004-06-26 11:27:52 +000091/* Application-visible file descriptor limits */
92extern Int VG_(fd_soft_limit);
93extern Int VG_(fd_hard_limit);
fitzhardingef0046f22003-12-18 02:39:22 +000094
sewardjde4a1d02002-03-22 01:27:54 +000095/* ---------------------------------------------------------------------
nethercote85cdd342004-08-01 22:36:40 +000096 Profiling stuff
sewardjde4a1d02002-03-22 01:27:54 +000097 ------------------------------------------------------------------ */
98
njn31066fd2005-03-26 00:42:02 +000099extern void VG_(init_profiling) ( void );
100extern void VG_(done_profiling) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000101
njn25e49d8e72002-09-23 09:36:25 +0000102#undef VGP_PUSHCC
103#undef VGP_POPCC
njn31066fd2005-03-26 00:42:02 +0000104#define VGP_PUSHCC(x) if (VG_(clo_profile)) VG_(pushcc)(x)
105#define VGP_POPCC(x) if (VG_(clo_profile)) VG_(popcc)(x)
sewardjde4a1d02002-03-22 01:27:54 +0000106
sewardj51ac0872004-12-21 01:20:49 +0000107
sewardjde4a1d02002-03-22 01:27:54 +0000108/* ---------------------------------------------------------------------
njn3e884182003-04-15 13:03:23 +0000109 Exports of vg_intercept.c
sewardj2e93c502002-04-12 11:12:52 +0000110 ------------------------------------------------------------------ */
111
njna91498f2005-05-11 22:32:39 +0000112/* These are the internal client request codes. The publically-visible
113 request codes are also defined in valgrind.h, and similar headers for
114 some tools. */
sewardj2e93c502002-04-12 11:12:52 +0000115
njna91498f2005-05-11 22:32:39 +0000116/* Get the tool's malloc-wrapping functions */
fitzhardinge98abfc72003-12-16 02:05:15 +0000117#define VG_USERREQ__GET_MALLOCFUNCS 0x3030
sewardjb5f6f512005-03-10 23:59:00 +0000118
fitzhardinge39de4b42003-10-31 07:12:21 +0000119/* Internal equivalent of VALGRIND_PRINTF . */
120#define VG_USERREQ__INTERNAL_PRINTF 0x3103
sewardj45b4b372002-04-16 22:50:32 +0000121
sewardjb5f6f512005-03-10 23:59:00 +0000122/* Denote the finish of __libc_freeres_wrapper().
123 A synonym for exit. */
124#define VG_USERREQ__LIBC_FREERES_DONE 0x3029
sewardj54cacf02002-04-12 23:24:59 +0000125
njn717cde52005-05-10 02:47:21 +0000126/* Intercept prefix stuff. See
127 coregrind/m_replace_malloc/vg_replace_malloc.c for details.
128 Unfortunately the "_vgi_" literal is also hardcoded in that file, so if
129 you change this one you must also change the other one. */
sewardj9ee81f52005-04-02 17:38:59 +0000130#define VG_INTERCEPT_PREFIX "_vgi_"
131#define VG_INTERCEPT_PREFIX_LEN 5
rjwalshe4e779d2004-04-16 23:02:29 +0000132
sewardj9ee81f52005-04-02 17:38:59 +0000133/* Not sure what these are for. Todo: clarify */
134#define VG_WRAPPER_PREFIX "_vgw_"
135#define VG_WRAPPER_PREFIX_LEN 5
136#define VG_WRAPPER(name) _vgw_##name
137#define VG_WRAPPER_ALIAS(name) "_vgw_" #name
rjwalshe4e779d2004-04-16 23:02:29 +0000138
njn4c791212003-05-02 17:53:54 +0000139
sewardj2e93c502002-04-12 11:12:52 +0000140/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000141 Exports of vg_signals.c
142 ------------------------------------------------------------------ */
143
sewardjb5f6f512005-03-10 23:59:00 +0000144/* Highest signal the kernel will let us use */
145extern Int VG_(max_signal);
jsgf855d93d2003-10-13 22:26:55 +0000146
sewardjde4a1d02002-03-22 01:27:54 +0000147extern void VG_(sigstartup_actions) ( void );
148
sewardjb5f6f512005-03-10 23:59:00 +0000149/* Poll a thread's set of pending signals, and update the Thread's context to deliver one */
150extern void VG_(poll_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000151
152/* Fake system calls for signal handling. */
njn502badb2005-05-08 02:04:49 +0000153extern Int VG_(do_sys_sigaltstack) ( ThreadId tid, vki_stack_t* ss,
154 vki_stack_t* oss );
155extern Int VG_(do_sys_sigaction) ( Int signo,
156 const struct vki_sigaction *new_act,
157 struct vki_sigaction *old_act );
158extern Int VG_(do_sys_sigprocmask) ( ThreadId tid, Int how,
159 vki_sigset_t* set,
160 vki_sigset_t* oldset );
sewardjefbfcdf2002-06-19 17:35:45 +0000161
njn444eba12005-05-12 03:47:31 +0000162extern void VG_(clear_out_queued_signals)
163 ( ThreadId tid, /* OUT */ vki_sigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000164
jsgf855d93d2003-10-13 22:26:55 +0000165extern void VG_(kill_self)(Int sigNo);
166
fitzhardingef1beb252004-03-16 09:49:08 +0000167/* These function synthesize a fault, as if the running instruction
168 had had a fault. These functions do not return - they longjmp back
169 into the scheduler so the signal can be delivered. */
170extern void VG_(synth_fault) (ThreadId tid);
171extern void VG_(synth_fault_mapping)(ThreadId tid, Addr addr);
172extern void VG_(synth_fault_perms) (ThreadId tid, Addr addr);
sewardj5e2f0012004-12-13 14:10:34 +0000173extern void VG_(synth_sigill) (ThreadId tid, Addr addr);
fitzhardingef1beb252004-03-16 09:49:08 +0000174
sewardjb5f6f512005-03-10 23:59:00 +0000175/* Extend the stack to cover addr, if possible */
176extern Bool VG_(extend_stack)(Addr addr, UInt maxsize);
177
178/* Returns True if the signal is OK for the client to use */
179extern Bool VG_(client_signal_OK)(Int sigNo);
180
181/* Forces the client's signal handler to SIG_DFL - generally just
182 before using that signal to kill the process. */
183extern void VG_(set_default_handler)(Int sig);
184
sewardjde4a1d02002-03-22 01:27:54 +0000185/* ---------------------------------------------------------------------
186 Exports of vg_mylibc.c
187 ------------------------------------------------------------------ */
188
njnca0518d2004-11-26 19:34:36 +0000189// Useful for making failing stubs, when certain things haven't yet been
190// implemented.
njn50ae1a72005-04-08 23:28:23 +0000191#define I_die_here \
sewardj0ab10c42005-05-12 08:26:36 +0000192 VG_(assert_fail) (/*isCore*//*BOGUS*/True, \
193 "Unimplemented functionality", \
njn50ae1a72005-04-08 23:28:23 +0000194 __FILE__, __LINE__, __PRETTY_FUNCTION__, \
195 "valgrind", VG_BUGS_TO, "")
njnca0518d2004-11-26 19:34:36 +0000196
njn50ae1a72005-04-08 23:28:23 +0000197#define vg_assert(expr) \
198 ((void) ((expr) ? 0 : \
199 (VG_(assert_fail) (/*isCore*/True, VG_STRINGIFY(expr), \
200 __FILE__, __LINE__, __PRETTY_FUNCTION__, \
201 ""), \
202 0)))
203
204#define vg_assert2(expr, format, args...) \
205 ((void) ((expr) ? 0 : \
206 (VG_(assert_fail) (/*isCore*/True, VG_STRINGIFY(expr), \
207 __FILE__, __LINE__, __PRETTY_FUNCTION__, \
208 format, ##args), \
209 0)))
210
njne427a662002-10-02 11:08:25 +0000211__attribute__ ((__noreturn__))
212extern void VG_(core_panic) ( Char* str );
thughes5876d552004-09-26 18:44:06 +0000213__attribute__ ((__noreturn__))
njnd01fef72005-03-25 23:35:48 +0000214extern void VG_(core_panic_at) ( Char* str, StackTrace ips );
sewardjde4a1d02002-03-22 01:27:54 +0000215
nethercote05675c82004-08-04 10:37:49 +0000216/* Tools use VG_(strdup)() which doesn't expose ArenaId */
njn25e49d8e72002-09-23 09:36:25 +0000217extern Char* VG_(arena_strdup) ( ArenaId aid, const Char* s);
sewardjde4a1d02002-03-22 01:27:54 +0000218
njn25e49d8e72002-09-23 09:36:25 +0000219extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
jsgf855d93d2003-10-13 22:26:55 +0000220extern Int VG_(poll)( struct vki_pollfd *, UInt nfds, Int timeout);
sewardj2e93c502002-04-12 11:12:52 +0000221
fitzhardinge98abfc72003-12-16 02:05:15 +0000222/* system/mman.h */
njn7df470b2005-05-29 18:46:38 +0000223extern void* VG_(mmap) ( void* start, SizeT length, UInt prot, UInt flags,
224 UInt sf_flags, UInt fd, OffT offset );
225extern void* VG_(mmap_native)( void* start, SizeT length, UInt prot, UInt flags,
226 UInt fd, OffT offset );
227extern Int VG_(munmap) ( void* start, SizeT length );
228extern Int VG_(mprotect) ( void *start, SizeT length, UInt prot );
sewardj79048ce2005-02-18 08:28:32 +0000229extern Int VG_(mprotect_native)( void *start, SizeT length, UInt prot );
fitzhardinge98abfc72003-12-16 02:05:15 +0000230
231
jsgf855d93d2003-10-13 22:26:55 +0000232/* Move an fd into the Valgrind-safe range */
233Int VG_(safe_fd)(Int oldfd);
234
sewardj570f8902002-11-03 11:44:36 +0000235extern Int VG_(write_socket)( Int sd, void *msg, Int count );
sewardj73cf3bc2002-11-03 03:20:15 +0000236
237/* --- Connecting over the network --- */
238extern Int VG_(connect_via_socket)( UChar* str );
239
fitzhardinge98abfc72003-12-16 02:05:15 +0000240/* Environment manipulations */
nethercote60a96c52004-08-03 13:08:31 +0000241extern Char **VG_(env_setenv) ( Char ***envp, const Char* varname,
242 const Char *val );
243extern void VG_(env_unsetenv) ( Char **env, const Char *varname );
244extern void VG_(env_remove_valgrind_env_stuff) ( Char** env );
sewardj570f8902002-11-03 11:44:36 +0000245
sewardjb5f6f512005-03-10 23:59:00 +0000246extern void VG_(nanosleep)(struct vki_timespec *);
njn2521d322005-05-08 14:45:13 +0000247
sewardj570f8902002-11-03 11:44:36 +0000248/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000249 Exports of vg_symtab2.c
250 ------------------------------------------------------------------ */
251
fitzhardinge98abfc72003-12-16 02:05:15 +0000252typedef struct _Segment Segment;
sewardjb5f6f512005-03-10 23:59:00 +0000253typedef struct _CodeRedirect CodeRedirect;
fitzhardinge98abfc72003-12-16 02:05:15 +0000254
255extern Bool VG_(is_object_file) ( const void *hdr );
fitzhardinge98abfc72003-12-16 02:05:15 +0000256extern SegInfo * VG_(read_seg_symbols) ( Segment *seg );
njn36ef6ba2005-05-14 18:42:26 +0000257extern void VG_(seginfo_incref) ( SegInfo * );
258extern void VG_(seginfo_decref) ( SegInfo *, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +0000259
njn25e49d8e72002-09-23 09:36:25 +0000260extern Bool VG_(get_fnname_nodemangle)( Addr a, Char* fnname, Int n_fnname );
sewardj25c7c3a2003-07-10 00:17:58 +0000261
sewardjb5f6f512005-03-10 23:59:00 +0000262extern Addr VG_(reverse_search_one_symtab) ( const SegInfo* si, const Char* name );
263
sewardj35165532005-04-30 18:47:48 +0000264extern Bool VG_(use_CFI_info) ( /*MOD*/Addr* ipP,
265 /*MOD*/Addr* spP,
266 /*MOD*/Addr* fpP,
267 Addr min_accessible,
268 Addr max_accessible );
269
270
sewardjb5f6f512005-03-10 23:59:00 +0000271/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000272 Exports of vg_main.c
273 ------------------------------------------------------------------ */
274
sewardj73cf3bc2002-11-03 03:20:15 +0000275/* Tell the logging mechanism whether we are logging to a file
276 descriptor or a socket descriptor. */
njnbe9b47b2005-05-15 16:22:58 +0000277extern Bool VG_(logging_to_socket);
sewardj73cf3bc2002-11-03 03:20:15 +0000278
njn25e49d8e72002-09-23 09:36:25 +0000279/* Sanity checks which may be done at any time. The scheduler decides when. */
nethercote885dd912004-08-03 23:14:00 +0000280extern void VG_(sanity_check_general) ( Bool force_expensive );
njn25e49d8e72002-09-23 09:36:25 +0000281
fitzhardinge98abfc72003-12-16 02:05:15 +0000282/* Address space */
283extern Addr VG_(client_base); /* client address space limits */
284extern Addr VG_(client_end);
285extern Addr VG_(client_mapbase); /* base of mappings */
286extern Addr VG_(clstk_base); /* client stack range */
287extern Addr VG_(clstk_end);
fitzhardinge92360792003-12-24 10:11:11 +0000288extern Addr VG_(client_trampoline_code);
289
fitzhardinge98abfc72003-12-16 02:05:15 +0000290extern Addr VG_(brk_base); /* start of brk */
291extern Addr VG_(brk_limit); /* current brk */
nethercote996901a2004-08-03 13:29:09 +0000292extern Addr VG_(shadow_base); /* tool's shadow memory */
fitzhardinge98abfc72003-12-16 02:05:15 +0000293extern Addr VG_(shadow_end);
294extern Addr VG_(valgrind_base); /* valgrind's address range */
nethercote820bd8c2004-09-07 23:04:49 +0000295extern Addr VG_(valgrind_last); // Nb: last byte, rather than one past the end
fitzhardinge98abfc72003-12-16 02:05:15 +0000296
nethercote73b526f2004-10-31 18:48:21 +0000297extern struct vki_rlimit VG_(client_rlimit_data); /* client's original rlimit data */
298extern struct vki_rlimit VG_(client_rlimit_stack); /* client's original rlimit stack */
fitzhardingeb50068f2004-02-24 23:42:55 +0000299
fitzhardingea49f9b52003-12-16 22:26:45 +0000300/* client executable file descriptor */
301extern Int VG_(clexecfd);
fitzhardinge98abfc72003-12-16 02:05:15 +0000302
nethercotef6a1d502004-08-09 12:21:57 +0000303// Help set up the child used when doing execve() with --trace-children=yes
304Char* VG_(build_child_VALGRINDCLO) ( Char* exename );
305Char* VG_(build_child_exename) ( void );
306
sewardjde4a1d02002-03-22 01:27:54 +0000307/* Called when some unhandleable client behaviour is detected.
308 Prints a msg and aborts. */
njn25e49d8e72002-09-23 09:36:25 +0000309extern void VG_(unimplemented) ( Char* msg )
310 __attribute__((__noreturn__));
sewardjde4a1d02002-03-22 01:27:54 +0000311
nethercote04d0fbc2004-01-26 16:48:06 +0000312/* Something of a function looking for a home ... start up debugger. */
njnc6168192004-11-29 13:54:10 +0000313extern void VG_(start_debugger) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000314
sewardj4ccf7072004-11-28 16:58:05 +0000315/* Stats ... */
nethercote844e7122004-08-02 15:27:22 +0000316extern void VG_(print_scheduler_stats) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000317
njn1f707722005-03-27 03:17:52 +0000318/* 64-bit counter for the number of basic blocks done. */
319extern ULong VG_(bbs_done);
320
nethercote2e05c332004-09-06 16:43:37 +0000321
sewardjde4a1d02002-03-22 01:27:54 +0000322/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000323 Exports of vg_syscall.S
324 ------------------------------------------------------------------ */
325
njnca6fef02004-11-29 16:49:18 +0000326// We use a full prototype rather than "..." here to ensure that all
327// arguments get converted to a UWord appropriately. Not doing so can
328// cause problems when passing 32-bit integers on 64-bit platforms, because
329// the top 32-bits might not be zeroed appropriately, eg. as would happen
330// with the 6th arg on AMD64 which is passed on the stack.
njnf4aeaea2004-11-29 17:33:31 +0000331extern Word VG_(do_syscall) ( UInt, UWord, UWord, UWord, UWord, UWord, UWord );
njnca6fef02004-11-29 16:49:18 +0000332
333// Macros make life easier.
334#define vgPlain_do_syscall0(s) VG_(do_syscall)((s),0,0,0,0,0,0)
335#define vgPlain_do_syscall1(s,a) VG_(do_syscall)((s),(a),0,0,0,0,0)
336#define vgPlain_do_syscall2(s,a,b) VG_(do_syscall)((s),(a),(b),0,0,0,0)
337#define vgPlain_do_syscall3(s,a,b,c) VG_(do_syscall)((s),(a),(b),(c),0,0,0)
338#define vgPlain_do_syscall4(s,a,b,c,d) VG_(do_syscall)((s),(a),(b),(c),(d),0,0)
339#define vgPlain_do_syscall5(s,a,b,c,d,e) VG_(do_syscall)((s),(a),(b),(c),(d),(e),0)
340#define vgPlain_do_syscall6(s,a,b,c,d,e,f) VG_(do_syscall)((s),(a),(b),(c),(d),(e),(f))
341
fitzhardinge4f10ada2004-06-03 10:00:42 +0000342extern void VG_(sigreturn)(void);
sewardjde4a1d02002-03-22 01:27:54 +0000343
344/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000345 Exports of vg_helpers.S
346 ------------------------------------------------------------------ */
347
fitzhardinge92360792003-12-24 10:11:11 +0000348/* Information about trampoline code (for signal return and syscalls) */
349extern const Char VG_(trampoline_code_start);
350extern const Int VG_(trampoline_code_length);
351extern const Int VG_(tramp_sigreturn_offset);
sewardjb5f6f512005-03-10 23:59:00 +0000352extern const Int VG_(tramp_rt_sigreturn_offset);
fitzhardinge92360792003-12-24 10:11:11 +0000353extern const Int VG_(tramp_syscall_offset);
tomee0bcbf2005-05-02 10:28:42 +0000354extern const Int VG_(tramp_gettimeofday_offset);
355extern const Int VG_(tramp_time_offset);
sewardj20917d82002-05-28 01:36:45 +0000356
nethercotec06e2132004-09-03 13:45:29 +0000357// ---------------------------------------------------------------------
358// Architecture-specific things defined in eg. x86/*.c
359// ---------------------------------------------------------------------
360
sewardj51ac0872004-12-21 01:20:49 +0000361// Returns the architecture and subarchitecture, or indicates
362// that this subarchitecture is unable to run Valgrind
363// Returns False to indicate we cannot proceed further.
sewardj51ac0872004-12-21 01:20:49 +0000364extern Bool VGA_(getArchAndSubArch)( /*OUT*/VexArch*,
365 /*OUT*/VexSubArch* );
njncf45fd42004-11-24 16:30:22 +0000366// Accessors for the ThreadArchState
njn35172bc2005-03-26 00:04:03 +0000367#define INSTR_PTR(regs) ((regs).vex.VGA_INSTR_PTR)
368#define STACK_PTR(regs) ((regs).vex.VGA_STACK_PTR)
369#define FRAME_PTR(regs) ((regs).vex.VGA_FRAME_PTR)
370#define CLREQ_ARGS(regs) ((regs).vex.VGA_CLREQ_ARGS)
njn35172bc2005-03-26 00:04:03 +0000371#define CLREQ_RET(regs) ((regs).vex.VGA_CLREQ_RET)
njn16de5572004-11-27 14:27:21 +0000372// Offsets for the Vex state
njn35172bc2005-03-26 00:04:03 +0000373#define O_STACK_PTR (offsetof(VexGuestArchState, VGA_STACK_PTR))
374#define O_FRAME_PTR (offsetof(VexGuestArchState, VGA_FRAME_PTR))
375#define O_CLREQ_RET (offsetof(VexGuestArchState, VGA_CLREQ_RET))
njncf45fd42004-11-24 16:30:22 +0000376
377
sewardj2a99cf62004-11-24 10:44:19 +0000378// Setting up the initial thread (1) state
379extern void
380 VGA_(init_thread1state) ( Addr client_eip,
381 Addr esp_at_startup,
382 /*MOD*/ ThreadArchState* arch );
sewardjde4a1d02002-03-22 01:27:54 +0000383
sewardjb5f6f512005-03-10 23:59:00 +0000384// OS/Platform-specific thread clear (after thread exit)
sewardj1d887112005-05-30 21:44:08 +0000385extern void VGO_(os_state_clear)(ThreadState *);
sewardjb5f6f512005-03-10 23:59:00 +0000386
387// OS/Platform-specific thread init (at scheduler init time)
sewardj1d887112005-05-30 21:44:08 +0000388extern void VGO_(os_state_init)(ThreadState *);
sewardjb5f6f512005-03-10 23:59:00 +0000389
sewardj1d887112005-05-30 21:44:08 +0000390// Run a thread from beginning to end.
391extern VgSchedReturnCode VGO_(thread_wrapper)(Word /*ThreadId*/ tid);
sewardjb5f6f512005-03-10 23:59:00 +0000392
sewardj1d887112005-05-30 21:44:08 +0000393// Call here to exit the entire Valgrind system.
394extern void VGO_(terminate_NORETURN)(ThreadId tid, VgSchedReturnCode src);
395
396// Allocates a stack for the first thread, then runs it,
397// as if the thread had been set up by clone()
398extern void VGP_(main_thread_wrapper_NORETURN)(ThreadId tid);
sewardjb5f6f512005-03-10 23:59:00 +0000399
400// Return how many bytes of a thread's Valgrind stack are unused
sewardj1d887112005-05-30 21:44:08 +0000401extern SSizeT VGA_(stack_unused)(ThreadId tid);
sewardjb5f6f512005-03-10 23:59:00 +0000402
sewardjb5f6f512005-03-10 23:59:00 +0000403// wait until all other threads are dead
404extern void VGA_(reap_threads)(ThreadId self);
405
406// handle an arch-specific client request
407extern Bool VGA_(client_request)(ThreadId tid, UWord *args);
408
nethercotefedd8102004-09-13 15:19:34 +0000409// Pointercheck
410extern Bool VGA_(setup_pointercheck) ( void );
411
412// For attaching the debugger
sewardj2a99cf62004-11-24 10:44:19 +0000413extern Int VGA_(ptrace_setregs_from_tst) ( Int pid, ThreadArchState* arch );
nethercotefedd8102004-09-13 15:19:34 +0000414
sewardjb5f6f512005-03-10 23:59:00 +0000415// Used by leakcheck
416extern void VGA_(mark_from_registers)(ThreadId tid, void (*marker)(Addr));
417
njn20242342005-05-16 23:31:24 +0000418// Set up the libc freeres wrapper
419extern void VGA_(intercept_libc_freeres_wrapper)(Addr);
420
421// Clean up the client by calling before the final reports
422extern void VGA_(final_tidyup)(ThreadId tid);
423
424// Arch-specific client requests
425extern Bool VGA_(client_requests)(ThreadId tid, UWord *args);
426
nethercote9b3c7652004-10-19 13:18:00 +0000427
sewardjb5f6f512005-03-10 23:59:00 +0000428///* ---------------------------------------------------------------------
429// Thread modelling
430// ------------------------------------------------------------------ */
431//extern void VG_(tm_thread_create) (ThreadId creator, ThreadId tid, Bool detached);
432//extern void VG_(tm_thread_exit) (ThreadId tid);
433//extern Bool VG_(tm_thread_exists) (ThreadId tid);
434//extern void VG_(tm_thread_detach) (ThreadId tid);
435//extern void VG_(tm_thread_join) (ThreadId joiner, ThreadId joinee);
436//extern void VG_(tm_thread_switchto)(ThreadId tid);
437//
438//extern void VG_(tm_mutex_init) (ThreadId tid, Addr mutexp);
439//extern void VG_(tm_mutex_destroy)(ThreadId tid, Addr mutexp);
440//extern void VG_(tm_mutex_trylock)(ThreadId tid, Addr mutexp);
441//extern void VG_(tm_mutex_giveup) (ThreadId tid, Addr mutexp);
442//extern void VG_(tm_mutex_acquire)(ThreadId tid, Addr mutexp);
443//extern void VG_(tm_mutex_tryunlock)(ThreadId tid, Addr mutexp);
444//extern void VG_(tm_mutex_unlock) (ThreadId tid, Addr mutexp);
445//extern Bool VG_(tm_mutex_exists) (Addr mutexp);
446//
447//extern UInt VG_(tm_error_update_extra) (Error *err);
448//extern Bool VG_(tm_error_equal) (VgRes res, Error *e1, Error *e2);
449//extern void VG_(tm_error_print) (Error *err);
450//
451//extern void VG_(tm_init) ();
452//
453//extern void VG_(tm_cond_init) (ThreadId tid, Addr condp);
454//extern void VG_(tm_cond_destroy) (ThreadId tid, Addr condp);
455//extern void VG_(tm_cond_wait) (ThreadId tid, Addr condp, Addr mutexp);
456//extern void VG_(tm_cond_wakeup) (ThreadId tid, Addr condp, Addr mutexp);
457//extern void VG_(tm_cond_signal) (ThreadId tid, Addr condp);
458//
459///* ----- pthreads ----- */
460//extern void VG_(pthread_init) ();
461//extern void VG_(pthread_startfunc_wrapper)(Addr wrapper);
462//
463//struct vg_pthread_newthread_data {
464// void *(*startfunc)(void *arg);
465// void *arg;
466//};
sewardj3b2736a2002-03-24 12:18:35 +0000467
468/* ---------------------------------------------------------------------
469 Finally - autoconf-generated settings
470 ------------------------------------------------------------------ */
471
472#include "config.h"
473
nethercotec06e2132004-09-03 13:45:29 +0000474#endif /* ndef __CORE_H */
475
sewardjde4a1d02002-03-22 01:27:54 +0000476/*--------------------------------------------------------------------*/
nethercote109d0df2004-09-02 08:10:13 +0000477/*--- end ---*/
sewardjde4a1d02002-03-22 01:27:54 +0000478/*--------------------------------------------------------------------*/