blob: 0c7d2cec4978a2f4a9bcc41c625654295a620cf4 [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
njn717cde52005-05-10 02:47:21 +000040#include "pub_core_mallocfree.h" // for type 'ArenaId'
njnd01fef72005-03-25 23:35:48 +000041#include "pub_core_stacktrace.h" // for type 'StackTrace'
42
njn4f6e3702005-05-16 20:50:52 +000043#include <setjmp.h> /* for jmp_buf */
44
nethercote7be47252004-09-02 16:02:58 +000045/* ---------------------------------------------------------------------
njn14319cc2005-03-13 06:26:22 +000046 Global macros.
nethercote7be47252004-09-02 16:02:58 +000047 ------------------------------------------------------------------ */
48
sewardjde4a1d02002-03-22 01:27:54 +000049/* Max length of a text fragment used to construct error messages. */
njn47b209a2005-03-25 23:47:16 +000050#define VG_ERRTXT_LEN 4096
sewardjde4a1d02002-03-22 01:27:54 +000051
sewardjde4a1d02002-03-22 01:27:54 +000052/* The maximum number of calls we're prepared to save in a
53 backtrace. */
54#define VG_DEEPEST_BACKTRACE 50
55
fitzhardinge98abfc72003-12-16 02:05:15 +000056/* Useful macros */
57/* a - alignment - must be a power of 2 */
tomde2ec262005-03-29 12:16:10 +000058#define ROUNDDN(p, a) ((Addr)(p) & ~((Addr)(a)-1))
fitzhardinge98abfc72003-12-16 02:05:15 +000059#define ROUNDUP(p, a) ROUNDDN((p)+(a)-1, (a))
nethercote73b526f2004-10-31 18:48:21 +000060#define PGROUNDDN(p) ROUNDDN(p, VKI_PAGE_SIZE)
61#define PGROUNDUP(p) ROUNDUP(p, VKI_PAGE_SIZE)
fitzhardinge98abfc72003-12-16 02:05:15 +000062
sewardj51ac0872004-12-21 01:20:49 +000063
nethercote80013e92004-09-05 20:39:51 +000064/* ---------------------------------------------------------------------
65 Environment variables
66 ------------------------------------------------------------------ */
67
68/* The directory we look for all our auxillary files in */
69#define VALGRINDLIB "VALGRINDLIB"
70
71/* Additional command-line arguments; they are overridden by actual
72 command-line option. Each argument is separated by spaces. There
73 is no quoting mechanism.
74 */
75#define VALGRINDOPTS "VALGRIND_OPTS"
76
77/* If this variable is present in the environment, then valgrind will
78 not parse the command line for options at all; all options come
79 from this variable. Arguments are terminated by ^A (\001). There
80 is no quoting mechanism.
81
82 This variable is not expected to be set by anything other than
83 Valgrind itself, as part of its handling of execve with
84 --trace-children=yes. This variable should not be present in the
85 client environment.
86 */
87#define VALGRINDCLO "_VALGRIND_CLO"
88
fitzhardinge98abfc72003-12-16 02:05:15 +000089
thughesad1c9562004-06-26 11:27:52 +000090/* Application-visible file descriptor limits */
91extern Int VG_(fd_soft_limit);
92extern Int VG_(fd_hard_limit);
fitzhardingef0046f22003-12-18 02:39:22 +000093
sewardjde4a1d02002-03-22 01:27:54 +000094/* ---------------------------------------------------------------------
nethercote85cdd342004-08-01 22:36:40 +000095 Profiling stuff
sewardjde4a1d02002-03-22 01:27:54 +000096 ------------------------------------------------------------------ */
97
njn31066fd2005-03-26 00:42:02 +000098extern void VG_(init_profiling) ( void );
99extern void VG_(done_profiling) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000100
njn25e49d8e72002-09-23 09:36:25 +0000101#undef VGP_PUSHCC
102#undef VGP_POPCC
njn31066fd2005-03-26 00:42:02 +0000103#define VGP_PUSHCC(x) if (VG_(clo_profile)) VG_(pushcc)(x)
104#define VGP_POPCC(x) if (VG_(clo_profile)) VG_(popcc)(x)
sewardjde4a1d02002-03-22 01:27:54 +0000105
sewardj51ac0872004-12-21 01:20:49 +0000106
sewardjde4a1d02002-03-22 01:27:54 +0000107/* ---------------------------------------------------------------------
njn3e884182003-04-15 13:03:23 +0000108 Exports of vg_intercept.c
sewardj2e93c502002-04-12 11:12:52 +0000109 ------------------------------------------------------------------ */
110
njna91498f2005-05-11 22:32:39 +0000111/* These are the internal client request codes. The publically-visible
112 request codes are also defined in valgrind.h, and similar headers for
113 some tools. */
sewardj2e93c502002-04-12 11:12:52 +0000114
njna91498f2005-05-11 22:32:39 +0000115/* Get the tool's malloc-wrapping functions */
fitzhardinge98abfc72003-12-16 02:05:15 +0000116#define VG_USERREQ__GET_MALLOCFUNCS 0x3030
sewardjb5f6f512005-03-10 23:59:00 +0000117
fitzhardinge39de4b42003-10-31 07:12:21 +0000118/* Internal equivalent of VALGRIND_PRINTF . */
119#define VG_USERREQ__INTERNAL_PRINTF 0x3103
sewardj45b4b372002-04-16 22:50:32 +0000120
sewardjb5f6f512005-03-10 23:59:00 +0000121/* Denote the finish of __libc_freeres_wrapper().
122 A synonym for exit. */
123#define VG_USERREQ__LIBC_FREERES_DONE 0x3029
sewardj54cacf02002-04-12 23:24:59 +0000124
njn717cde52005-05-10 02:47:21 +0000125/* Intercept prefix stuff. See
126 coregrind/m_replace_malloc/vg_replace_malloc.c for details.
127 Unfortunately the "_vgi_" literal is also hardcoded in that file, so if
128 you change this one you must also change the other one. */
sewardj9ee81f52005-04-02 17:38:59 +0000129#define VG_INTERCEPT_PREFIX "_vgi_"
130#define VG_INTERCEPT_PREFIX_LEN 5
rjwalshe4e779d2004-04-16 23:02:29 +0000131
sewardj9ee81f52005-04-02 17:38:59 +0000132/* Not sure what these are for. Todo: clarify */
133#define VG_WRAPPER_PREFIX "_vgw_"
134#define VG_WRAPPER_PREFIX_LEN 5
135#define VG_WRAPPER(name) _vgw_##name
136#define VG_WRAPPER_ALIAS(name) "_vgw_" #name
rjwalshe4e779d2004-04-16 23:02:29 +0000137
njn4c791212003-05-02 17:53:54 +0000138
sewardj2e93c502002-04-12 11:12:52 +0000139/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000140 Exports of vg_scheduler.c
141 ------------------------------------------------------------------ */
142
sewardjb5f6f512005-03-10 23:59:00 +0000143/*
144 Thread state machine:
145
146 Empty -> Init -> Runnable <=> WaitSys/Yielding
147 ^ |
148 \---- Zombie -----/
149 */
sewardj2e93c502002-04-12 11:12:52 +0000150typedef
jsgf855d93d2003-10-13 22:26:55 +0000151 enum ThreadStatus {
sewardj2e93c502002-04-12 11:12:52 +0000152 VgTs_Empty, /* this slot is not in use */
sewardjb5f6f512005-03-10 23:59:00 +0000153 VgTs_Init, /* just allocated */
154 VgTs_Runnable, /* ready to run */
jsgf855d93d2003-10-13 22:26:55 +0000155 VgTs_WaitSys, /* waiting for a syscall to complete */
sewardjb5f6f512005-03-10 23:59:00 +0000156 VgTs_Yielding, /* temporarily yielding the CPU */
157 VgTs_Zombie, /* transient state just before exiting */
sewardj2e93c502002-04-12 11:12:52 +0000158 }
159 ThreadStatus;
sewardj8ad94e12002-05-29 00:10:20 +0000160
sewardjb5f6f512005-03-10 23:59:00 +0000161/* Return codes from the scheduler. */
thughes11975ff2004-06-12 12:58:22 +0000162typedef
sewardjb5f6f512005-03-10 23:59:00 +0000163 enum {
164 VgSrc_None, /* not exiting yet */
165 VgSrc_ExitSyscall, /* client called exit(). This is the normal
166 route out. */
167 VgSrc_FatalSig /* Killed by the default action of a fatal
168 signal */
thughes11975ff2004-06-12 12:58:22 +0000169 }
sewardjb5f6f512005-03-10 23:59:00 +0000170 VgSchedReturnCode;
thughes11975ff2004-06-12 12:58:22 +0000171
njn77e8ac12005-05-16 21:16:44 +0000172
173#if defined(VGA_x86)
174 typedef VexGuestX86State VexGuestArchState;
tombb422232005-05-16 23:16:25 +0000175#elif defined(VGA_amd64)
njn77e8ac12005-05-16 21:16:44 +0000176 typedef VexGuestAMD64State VexGuestArchState;
177#elif defined(VGA_arm)
178 typedef VexGuestARMState VexGuestArchState;
179#else
180# error Unknown architecture
181#endif
182
183
184typedef
185 struct {
186 /* --- BEGIN vex-mandated guest state --- */
187
188 /* Saved machine context. */
189 VexGuestArchState vex;
190
191 /* Saved shadow context. */
192 VexGuestArchState vex_shadow;
193
194 /* Spill area. */
195 UChar vex_spill[LibVEX_N_SPILL_BYTES];
196
197 /* --- END vex-mandated guest state --- */
198 }
199 ThreadArchState;
200
201
njn1b728002005-05-17 21:10:11 +0000202typedef struct {
njn25e49d8e72002-09-23 09:36:25 +0000203 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
204 The thread identity is simply the index in vg_threads[].
205 ThreadId == 1 is the root thread and has the special property
206 that we don't try and allocate or deallocate its stack. For
207 convenience of generating error message, we also put the
208 ThreadId in this tid field, but be aware that it should
209 ALWAYS == the index in vg_threads[]. */
210 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000211
sewardjb5f6f512005-03-10 23:59:00 +0000212 /* Current scheduling status. */
njn25e49d8e72002-09-23 09:36:25 +0000213 ThreadStatus status;
sewardj2e93c502002-04-12 11:12:52 +0000214
sewardjb5f6f512005-03-10 23:59:00 +0000215 /* This is set if the thread is in the process of exiting for any
216 reason. The precise details of the exit are in the OS-specific
217 state. */
218 VgSchedReturnCode exitreason;
sewardj3b5d8862002-04-20 13:53:23 +0000219
sewardjb5f6f512005-03-10 23:59:00 +0000220 /* Architecture-specific thread state. */
221 ThreadArchState arch;
sewardjb48e5002002-05-13 00:16:03 +0000222
njn25e49d8e72002-09-23 09:36:25 +0000223 /* This thread's blocked-signals mask. Semantics is that for a
224 signal to be delivered to this thread, the signal must not be
jsgf855d93d2003-10-13 22:26:55 +0000225 blocked by this signal mask. If more than one thread accepts a
226 signal, then it will be delivered to one at random. If all
227 threads block the signal, it will remain pending until either a
sewardjb5f6f512005-03-10 23:59:00 +0000228 thread unblocks it or someone uses sigwaitsig/sigtimedwait. */
nethercote73b526f2004-10-31 18:48:21 +0000229 vki_sigset_t sig_mask;
sewardjb48e5002002-05-13 00:16:03 +0000230
sewardjb5f6f512005-03-10 23:59:00 +0000231 /* tmp_sig_mask is usually the same as sig_mask, and is kept in
232 sync whenever sig_mask is changed. The only time they have
233 different values is during the execution of a sigsuspend, where
234 tmp_sig_mask is the temporary mask which sigsuspend installs.
235 It is only consulted to compute the signal mask applied to a
236 signal handler. */
237 vki_sigset_t tmp_sig_mask;
sewardj2e93c502002-04-12 11:12:52 +0000238
sewardjb5f6f512005-03-10 23:59:00 +0000239 /* A little signal queue for signals we can't get the kernel to
240 queue for us. This is only allocated as needed, since it should
241 be rare. */
242 struct SigQueue *sig_queue;
243
244 /* Syscall the Thread is currently running; -1 if none. Should only
245 be set while Thread is in VgTs_WaitSys. */
246 Int syscallno;
247
njn50ba34e2005-04-04 02:41:42 +0000248 /* Client stacks. When a thread slot is freed, we don't deallocate its
njn25e49d8e72002-09-23 09:36:25 +0000249 stack; we just leave it lying around for the next use of the
250 slot. If the next use of the slot requires a larger stack,
251 only then is the old one deallocated and a new one
252 allocated.
sewardj2e93c502002-04-12 11:12:52 +0000253
njn25e49d8e72002-09-23 09:36:25 +0000254 For the main thread (threadid == 0), this mechanism doesn't
255 apply. We don't know the size of the stack since we didn't
256 allocate it, and furthermore we never reallocate it. */
sewardj2e93c502002-04-12 11:12:52 +0000257
njn25e49d8e72002-09-23 09:36:25 +0000258 /* The allocated size of this thread's stack (permanently zero
259 if this is ThreadId == 0, since we didn't allocate its stack) */
njn50ba34e2005-04-04 02:41:42 +0000260 SizeT client_stack_szB;
sewardj2e93c502002-04-12 11:12:52 +0000261
sewardj92a59562002-09-30 00:53:10 +0000262 /* Address of the highest legitimate word in this stack. This is
263 used for error messages only -- not critical for execution
264 correctness. Is is set for all stacks, specifically including
265 ThreadId == 0 (the main thread). */
njn50ba34e2005-04-04 02:41:42 +0000266 Addr client_stack_highest_word;
njn25e49d8e72002-09-23 09:36:25 +0000267
fitzhardinge98c4dc02004-03-16 08:27:29 +0000268 /* Alternate signal stack */
nethercote73b526f2004-10-31 18:48:21 +0000269 vki_stack_t altstack;
fitzhardinge98c4dc02004-03-16 08:27:29 +0000270
sewardjb5f6f512005-03-10 23:59:00 +0000271 /* OS-specific thread state */
272 os_thread_t os_state;
sewardj004e8ca2005-02-28 17:27:04 +0000273
274 /* Used in the syscall handlers. Set to True to indicate that the
275 PRE routine for a syscall has set the syscall result already and
276 so the syscall does not need to be handed to the kernel. */
277 Bool syscall_result_set;
sewardjb5f6f512005-03-10 23:59:00 +0000278
279 /* Per-thread jmp_buf to resume scheduler after a signal */
280 Bool sched_jmpbuf_valid;
281 jmp_buf sched_jmpbuf;
njn1b728002005-05-17 21:10:11 +0000282}
283ThreadState;
284
sewardj2e93c502002-04-12 11:12:52 +0000285
sewardj018f7622002-05-15 21:13:39 +0000286/* The thread table. */
287extern ThreadState VG_(threads)[VG_N_THREADS];
288
sewardjb5f6f512005-03-10 23:59:00 +0000289/* Allocate a new ThreadState */
290extern ThreadId VG_(alloc_ThreadState)(void);
291
292/* A thread exits. tid must currently be running. */
293extern void VG_(exit_thread)(ThreadId tid);
294
295/* Kill a thread. This interrupts whatever a thread is doing, and
296 makes it exit ASAP. This does not set the exitreason or
297 exitcode. */
298extern void VG_(kill_thread)(ThreadId tid);
299
sewardj018f7622002-05-15 21:13:39 +0000300/* Check that tid is in range and denotes a non-Empty thread. */
sewardjb48e5002002-05-13 00:16:03 +0000301extern Bool VG_(is_valid_tid) ( ThreadId tid );
302
jsgf855d93d2003-10-13 22:26:55 +0000303/* Get the ThreadState for a particular thread */
304extern ThreadState *VG_(get_ThreadState)(ThreadId tid);
305
sewardjb5f6f512005-03-10 23:59:00 +0000306/* Given an LWP id (ie, real kernel thread id), find the corresponding
307 ThreadId */
308extern ThreadId VG_(get_lwp_tid)(Int lwpid);
309
310/* Returns true if a thread is currently running (ie, has the CPU lock) */
311extern Bool VG_(is_running_thread)(ThreadId tid);
312
313/* Returns true if the thread is in the process of exiting */
314extern Bool VG_(is_exiting)(ThreadId tid);
315
316/* Return the number of non-dead Threads */
317extern Int VG_(count_living_threads)(void);
318
sewardjccef2e62002-05-29 19:26:32 +0000319/* Nuke all threads except tid. */
njn1b728002005-05-17 21:10:11 +0000320extern void VG_(nuke_all_threads_except) ( ThreadId me,
321 VgSchedReturnCode reason );
sewardjccef2e62002-05-29 19:26:32 +0000322
sewardjb5f6f512005-03-10 23:59:00 +0000323/* Make a thread the running thread. The thread must previously been
324 sleeping, and not holding the CPU semaphore. This will set the
325 thread state to VgTs_Runnable, and the thread will attempt to take
326 the CPU semaphore. By the time it returns, tid will be the running
327 thread. */
328extern void VG_(set_running) ( ThreadId tid );
jsgf855d93d2003-10-13 22:26:55 +0000329
sewardjb5f6f512005-03-10 23:59:00 +0000330/* Set a thread into a sleeping state. Before the call, the thread
331 must be runnable, and holding the CPU semaphore. When this call
332 returns, the thread will be set to the specified sleeping state,
333 and will not be holding the CPU semaphore. Note that another
334 thread could be running by the time this call returns, so the
335 caller must be careful not to touch any shared state. It is also
336 the caller's responsibility to actually block until the thread is
337 ready to run again. */
338extern void VG_(set_sleeping) ( ThreadId tid, ThreadStatus state );
sewardj2e93c502002-04-12 11:12:52 +0000339
sewardjb5f6f512005-03-10 23:59:00 +0000340/* Yield the CPU for a while */
341extern void VG_(vg_yield)(void);
sewardj7e87e382002-05-03 19:09:05 +0000342
sewardjb5f6f512005-03-10 23:59:00 +0000343// The scheduler.
344extern VgSchedReturnCode VG_(scheduler) ( ThreadId tid );
345
346// Do everything which needs doing before the process finally ends,
347// like printing reports, etc
348extern void VG_(shutdown_actions)(ThreadId tid);
sewardj2e93c502002-04-12 11:12:52 +0000349
350extern void VG_(scheduler_init) ( void );
351
sewardj15a43e12002-04-17 19:35:12 +0000352extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000353
nethercote75d26242004-08-01 22:59:18 +0000354// Longjmp back to the scheduler and thus enter the sighandler immediately.
sewardjb5f6f512005-03-10 23:59:00 +0000355extern void VG_(resume_scheduler) ( ThreadId tid );
sewardj2e93c502002-04-12 11:12:52 +0000356
sewardjb5f6f512005-03-10 23:59:00 +0000357/* If true, a fault is Valgrind-internal (ie, a bug) */
358extern Bool VG_(my_fault);
nethercote238a3c32004-08-09 13:13:31 +0000359
sewardj2e93c502002-04-12 11:12:52 +0000360/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000361 Exports of vg_signals.c
362 ------------------------------------------------------------------ */
363
sewardjb5f6f512005-03-10 23:59:00 +0000364/* Highest signal the kernel will let us use */
365extern Int VG_(max_signal);
jsgf855d93d2003-10-13 22:26:55 +0000366
sewardjde4a1d02002-03-22 01:27:54 +0000367extern void VG_(sigstartup_actions) ( void );
368
sewardjb5f6f512005-03-10 23:59:00 +0000369/* Poll a thread's set of pending signals, and update the Thread's context to deliver one */
370extern void VG_(poll_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000371
372/* Fake system calls for signal handling. */
njn502badb2005-05-08 02:04:49 +0000373extern Int VG_(do_sys_sigaltstack) ( ThreadId tid, vki_stack_t* ss,
374 vki_stack_t* oss );
375extern Int VG_(do_sys_sigaction) ( Int signo,
376 const struct vki_sigaction *new_act,
377 struct vki_sigaction *old_act );
378extern Int VG_(do_sys_sigprocmask) ( ThreadId tid, Int how,
379 vki_sigset_t* set,
380 vki_sigset_t* oldset );
sewardjefbfcdf2002-06-19 17:35:45 +0000381
njn444eba12005-05-12 03:47:31 +0000382extern void VG_(clear_out_queued_signals)
383 ( ThreadId tid, /* OUT */ vki_sigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000384
jsgf855d93d2003-10-13 22:26:55 +0000385extern void VG_(kill_self)(Int sigNo);
386
fitzhardingef1beb252004-03-16 09:49:08 +0000387/* These function synthesize a fault, as if the running instruction
388 had had a fault. These functions do not return - they longjmp back
389 into the scheduler so the signal can be delivered. */
390extern void VG_(synth_fault) (ThreadId tid);
391extern void VG_(synth_fault_mapping)(ThreadId tid, Addr addr);
392extern void VG_(synth_fault_perms) (ThreadId tid, Addr addr);
sewardj5e2f0012004-12-13 14:10:34 +0000393extern void VG_(synth_sigill) (ThreadId tid, Addr addr);
fitzhardingef1beb252004-03-16 09:49:08 +0000394
sewardjb5f6f512005-03-10 23:59:00 +0000395/* Extend the stack to cover addr, if possible */
396extern Bool VG_(extend_stack)(Addr addr, UInt maxsize);
397
398/* Returns True if the signal is OK for the client to use */
399extern Bool VG_(client_signal_OK)(Int sigNo);
400
401/* Forces the client's signal handler to SIG_DFL - generally just
402 before using that signal to kill the process. */
403extern void VG_(set_default_handler)(Int sig);
404
sewardjde4a1d02002-03-22 01:27:54 +0000405/* ---------------------------------------------------------------------
406 Exports of vg_mylibc.c
407 ------------------------------------------------------------------ */
408
njnca0518d2004-11-26 19:34:36 +0000409// Useful for making failing stubs, when certain things haven't yet been
410// implemented.
njn50ae1a72005-04-08 23:28:23 +0000411#define I_die_here \
sewardj0ab10c42005-05-12 08:26:36 +0000412 VG_(assert_fail) (/*isCore*//*BOGUS*/True, \
413 "Unimplemented functionality", \
njn50ae1a72005-04-08 23:28:23 +0000414 __FILE__, __LINE__, __PRETTY_FUNCTION__, \
415 "valgrind", VG_BUGS_TO, "")
njnca0518d2004-11-26 19:34:36 +0000416
njn50ae1a72005-04-08 23:28:23 +0000417#define vg_assert(expr) \
418 ((void) ((expr) ? 0 : \
419 (VG_(assert_fail) (/*isCore*/True, VG_STRINGIFY(expr), \
420 __FILE__, __LINE__, __PRETTY_FUNCTION__, \
421 ""), \
422 0)))
423
424#define vg_assert2(expr, format, args...) \
425 ((void) ((expr) ? 0 : \
426 (VG_(assert_fail) (/*isCore*/True, VG_STRINGIFY(expr), \
427 __FILE__, __LINE__, __PRETTY_FUNCTION__, \
428 format, ##args), \
429 0)))
430
njne427a662002-10-02 11:08:25 +0000431__attribute__ ((__noreturn__))
432extern void VG_(core_panic) ( Char* str );
thughes5876d552004-09-26 18:44:06 +0000433__attribute__ ((__noreturn__))
njnd01fef72005-03-25 23:35:48 +0000434extern void VG_(core_panic_at) ( Char* str, StackTrace ips );
sewardjde4a1d02002-03-22 01:27:54 +0000435
nethercote05675c82004-08-04 10:37:49 +0000436/* Tools use VG_(strdup)() which doesn't expose ArenaId */
njn25e49d8e72002-09-23 09:36:25 +0000437extern Char* VG_(arena_strdup) ( ArenaId aid, const Char* s);
sewardjde4a1d02002-03-22 01:27:54 +0000438
njn25e49d8e72002-09-23 09:36:25 +0000439extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
jsgf855d93d2003-10-13 22:26:55 +0000440extern Int VG_(poll)( struct vki_pollfd *, UInt nfds, Int timeout);
sewardj2e93c502002-04-12 11:12:52 +0000441
fitzhardinge98abfc72003-12-16 02:05:15 +0000442/* system/mman.h */
njn7df470b2005-05-29 18:46:38 +0000443extern void* VG_(mmap) ( void* start, SizeT length, UInt prot, UInt flags,
444 UInt sf_flags, UInt fd, OffT offset );
445extern void* VG_(mmap_native)( void* start, SizeT length, UInt prot, UInt flags,
446 UInt fd, OffT offset );
447extern Int VG_(munmap) ( void* start, SizeT length );
448extern Int VG_(mprotect) ( void *start, SizeT length, UInt prot );
sewardj79048ce2005-02-18 08:28:32 +0000449extern Int VG_(mprotect_native)( void *start, SizeT length, UInt prot );
fitzhardinge98abfc72003-12-16 02:05:15 +0000450
451
jsgf855d93d2003-10-13 22:26:55 +0000452/* Move an fd into the Valgrind-safe range */
453Int VG_(safe_fd)(Int oldfd);
454
sewardj570f8902002-11-03 11:44:36 +0000455extern Int VG_(write_socket)( Int sd, void *msg, Int count );
sewardj73cf3bc2002-11-03 03:20:15 +0000456
457/* --- Connecting over the network --- */
458extern Int VG_(connect_via_socket)( UChar* str );
459
fitzhardinge98abfc72003-12-16 02:05:15 +0000460/* Environment manipulations */
nethercote60a96c52004-08-03 13:08:31 +0000461extern Char **VG_(env_setenv) ( Char ***envp, const Char* varname,
462 const Char *val );
463extern void VG_(env_unsetenv) ( Char **env, const Char *varname );
464extern void VG_(env_remove_valgrind_env_stuff) ( Char** env );
sewardj570f8902002-11-03 11:44:36 +0000465
sewardjb5f6f512005-03-10 23:59:00 +0000466extern void VG_(nanosleep)(struct vki_timespec *);
njn2521d322005-05-08 14:45:13 +0000467
sewardj570f8902002-11-03 11:44:36 +0000468/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000469 Exports of vg_symtab2.c
470 ------------------------------------------------------------------ */
471
fitzhardinge98abfc72003-12-16 02:05:15 +0000472typedef struct _Segment Segment;
sewardjb5f6f512005-03-10 23:59:00 +0000473typedef struct _CodeRedirect CodeRedirect;
fitzhardinge98abfc72003-12-16 02:05:15 +0000474
475extern Bool VG_(is_object_file) ( const void *hdr );
fitzhardinge98abfc72003-12-16 02:05:15 +0000476extern SegInfo * VG_(read_seg_symbols) ( Segment *seg );
njn36ef6ba2005-05-14 18:42:26 +0000477extern void VG_(seginfo_incref) ( SegInfo * );
478extern void VG_(seginfo_decref) ( SegInfo *, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +0000479
njn25e49d8e72002-09-23 09:36:25 +0000480extern Bool VG_(get_fnname_nodemangle)( Addr a, Char* fnname, Int n_fnname );
sewardj25c7c3a2003-07-10 00:17:58 +0000481
sewardjb5f6f512005-03-10 23:59:00 +0000482extern Addr VG_(reverse_search_one_symtab) ( const SegInfo* si, const Char* name );
483
sewardj35165532005-04-30 18:47:48 +0000484extern Bool VG_(use_CFI_info) ( /*MOD*/Addr* ipP,
485 /*MOD*/Addr* spP,
486 /*MOD*/Addr* fpP,
487 Addr min_accessible,
488 Addr max_accessible );
489
490
sewardjb5f6f512005-03-10 23:59:00 +0000491/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000492 Exports of vg_main.c
493 ------------------------------------------------------------------ */
494
sewardj73cf3bc2002-11-03 03:20:15 +0000495/* Tell the logging mechanism whether we are logging to a file
496 descriptor or a socket descriptor. */
njnbe9b47b2005-05-15 16:22:58 +0000497extern Bool VG_(logging_to_socket);
sewardj73cf3bc2002-11-03 03:20:15 +0000498
njn25e49d8e72002-09-23 09:36:25 +0000499/* Sanity checks which may be done at any time. The scheduler decides when. */
nethercote885dd912004-08-03 23:14:00 +0000500extern void VG_(sanity_check_general) ( Bool force_expensive );
njn25e49d8e72002-09-23 09:36:25 +0000501
fitzhardinge98abfc72003-12-16 02:05:15 +0000502/* Address space */
503extern Addr VG_(client_base); /* client address space limits */
504extern Addr VG_(client_end);
505extern Addr VG_(client_mapbase); /* base of mappings */
506extern Addr VG_(clstk_base); /* client stack range */
507extern Addr VG_(clstk_end);
fitzhardinge92360792003-12-24 10:11:11 +0000508extern Addr VG_(client_trampoline_code);
509
fitzhardinge98abfc72003-12-16 02:05:15 +0000510extern Addr VG_(brk_base); /* start of brk */
511extern Addr VG_(brk_limit); /* current brk */
nethercote996901a2004-08-03 13:29:09 +0000512extern Addr VG_(shadow_base); /* tool's shadow memory */
fitzhardinge98abfc72003-12-16 02:05:15 +0000513extern Addr VG_(shadow_end);
514extern Addr VG_(valgrind_base); /* valgrind's address range */
nethercote820bd8c2004-09-07 23:04:49 +0000515extern Addr VG_(valgrind_last); // Nb: last byte, rather than one past the end
fitzhardinge98abfc72003-12-16 02:05:15 +0000516
nethercote73b526f2004-10-31 18:48:21 +0000517extern struct vki_rlimit VG_(client_rlimit_data); /* client's original rlimit data */
518extern struct vki_rlimit VG_(client_rlimit_stack); /* client's original rlimit stack */
fitzhardingeb50068f2004-02-24 23:42:55 +0000519
fitzhardingea49f9b52003-12-16 22:26:45 +0000520/* client executable file descriptor */
521extern Int VG_(clexecfd);
fitzhardinge98abfc72003-12-16 02:05:15 +0000522
nethercotef6a1d502004-08-09 12:21:57 +0000523// Help set up the child used when doing execve() with --trace-children=yes
524Char* VG_(build_child_VALGRINDCLO) ( Char* exename );
525Char* VG_(build_child_exename) ( void );
526
sewardjb5f6f512005-03-10 23:59:00 +0000527/* The master thread the one which will be responsible for mopping
528 everything up at exit. Normally it is tid 1, since that's the
529 first thread created, but it may be something else after a
530 fork(). */
531extern ThreadId VG_(master_tid);
532
sewardjde4a1d02002-03-22 01:27:54 +0000533/* Called when some unhandleable client behaviour is detected.
534 Prints a msg and aborts. */
njn25e49d8e72002-09-23 09:36:25 +0000535extern void VG_(unimplemented) ( Char* msg )
536 __attribute__((__noreturn__));
sewardjde4a1d02002-03-22 01:27:54 +0000537
nethercote04d0fbc2004-01-26 16:48:06 +0000538/* Something of a function looking for a home ... start up debugger. */
njnc6168192004-11-29 13:54:10 +0000539extern void VG_(start_debugger) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000540
sewardj4ccf7072004-11-28 16:58:05 +0000541/* Stats ... */
nethercote844e7122004-08-02 15:27:22 +0000542extern void VG_(print_scheduler_stats) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000543
njn1f707722005-03-27 03:17:52 +0000544/* 64-bit counter for the number of basic blocks done. */
545extern ULong VG_(bbs_done);
546
nethercote2e05c332004-09-06 16:43:37 +0000547
sewardjde4a1d02002-03-22 01:27:54 +0000548/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000549 Exports of vg_syscall.S
550 ------------------------------------------------------------------ */
551
njnca6fef02004-11-29 16:49:18 +0000552// We use a full prototype rather than "..." here to ensure that all
553// arguments get converted to a UWord appropriately. Not doing so can
554// cause problems when passing 32-bit integers on 64-bit platforms, because
555// the top 32-bits might not be zeroed appropriately, eg. as would happen
556// with the 6th arg on AMD64 which is passed on the stack.
njnf4aeaea2004-11-29 17:33:31 +0000557extern Word VG_(do_syscall) ( UInt, UWord, UWord, UWord, UWord, UWord, UWord );
njnca6fef02004-11-29 16:49:18 +0000558
559// Macros make life easier.
560#define vgPlain_do_syscall0(s) VG_(do_syscall)((s),0,0,0,0,0,0)
561#define vgPlain_do_syscall1(s,a) VG_(do_syscall)((s),(a),0,0,0,0,0)
562#define vgPlain_do_syscall2(s,a,b) VG_(do_syscall)((s),(a),(b),0,0,0,0)
563#define vgPlain_do_syscall3(s,a,b,c) VG_(do_syscall)((s),(a),(b),(c),0,0,0)
564#define vgPlain_do_syscall4(s,a,b,c,d) VG_(do_syscall)((s),(a),(b),(c),(d),0,0)
565#define vgPlain_do_syscall5(s,a,b,c,d,e) VG_(do_syscall)((s),(a),(b),(c),(d),(e),0)
566#define vgPlain_do_syscall6(s,a,b,c,d,e,f) VG_(do_syscall)((s),(a),(b),(c),(d),(e),(f))
567
fitzhardinge4f10ada2004-06-03 10:00:42 +0000568extern void VG_(sigreturn)(void);
sewardjde4a1d02002-03-22 01:27:54 +0000569
570/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000571 Exports of vg_helpers.S
572 ------------------------------------------------------------------ */
573
fitzhardinge92360792003-12-24 10:11:11 +0000574/* Information about trampoline code (for signal return and syscalls) */
575extern const Char VG_(trampoline_code_start);
576extern const Int VG_(trampoline_code_length);
577extern const Int VG_(tramp_sigreturn_offset);
sewardjb5f6f512005-03-10 23:59:00 +0000578extern const Int VG_(tramp_rt_sigreturn_offset);
fitzhardinge92360792003-12-24 10:11:11 +0000579extern const Int VG_(tramp_syscall_offset);
tomee0bcbf2005-05-02 10:28:42 +0000580extern const Int VG_(tramp_gettimeofday_offset);
581extern const Int VG_(tramp_time_offset);
sewardj20917d82002-05-28 01:36:45 +0000582
nethercotec06e2132004-09-03 13:45:29 +0000583// ---------------------------------------------------------------------
584// Architecture-specific things defined in eg. x86/*.c
585// ---------------------------------------------------------------------
586
sewardj51ac0872004-12-21 01:20:49 +0000587// Returns the architecture and subarchitecture, or indicates
588// that this subarchitecture is unable to run Valgrind
589// Returns False to indicate we cannot proceed further.
sewardj51ac0872004-12-21 01:20:49 +0000590extern Bool VGA_(getArchAndSubArch)( /*OUT*/VexArch*,
591 /*OUT*/VexSubArch* );
njncf45fd42004-11-24 16:30:22 +0000592// Accessors for the ThreadArchState
njn35172bc2005-03-26 00:04:03 +0000593#define INSTR_PTR(regs) ((regs).vex.VGA_INSTR_PTR)
594#define STACK_PTR(regs) ((regs).vex.VGA_STACK_PTR)
595#define FRAME_PTR(regs) ((regs).vex.VGA_FRAME_PTR)
596#define CLREQ_ARGS(regs) ((regs).vex.VGA_CLREQ_ARGS)
njn35172bc2005-03-26 00:04:03 +0000597#define CLREQ_RET(regs) ((regs).vex.VGA_CLREQ_RET)
njn16de5572004-11-27 14:27:21 +0000598// Offsets for the Vex state
njn35172bc2005-03-26 00:04:03 +0000599#define O_STACK_PTR (offsetof(VexGuestArchState, VGA_STACK_PTR))
600#define O_FRAME_PTR (offsetof(VexGuestArchState, VGA_FRAME_PTR))
601#define O_CLREQ_RET (offsetof(VexGuestArchState, VGA_CLREQ_RET))
njncf45fd42004-11-24 16:30:22 +0000602
603
sewardj2a99cf62004-11-24 10:44:19 +0000604// Setting up the initial thread (1) state
605extern void
606 VGA_(init_thread1state) ( Addr client_eip,
607 Addr esp_at_startup,
608 /*MOD*/ ThreadArchState* arch );
sewardjde4a1d02002-03-22 01:27:54 +0000609
sewardjb5f6f512005-03-10 23:59:00 +0000610// OS/Platform-specific thread clear (after thread exit)
611extern void VGA_(os_state_clear)(ThreadState *);
612
613// OS/Platform-specific thread init (at scheduler init time)
614extern void VGA_(os_state_init)(ThreadState *);
615
616// Run a thread from beginning to end. Does not return if tid == VG_(master_tid).
sewardj0c1a5962005-03-22 00:19:55 +0000617void VGA_(thread_wrapper)(Word /*ThreadId*/ tid);
sewardjb5f6f512005-03-10 23:59:00 +0000618
619// Like VGA_(thread_wrapper), but it allocates a stack before calling
620// to VGA_(thread_wrapper) on that stack, as if it had been set up by
621// clone()
622void VGA_(main_thread_wrapper)(ThreadId tid) __attribute__ ((__noreturn__));
623
624// Return how many bytes of a thread's Valgrind stack are unused
njn990e90c2005-04-05 02:49:09 +0000625SSizeT VGA_(stack_unused)(ThreadId tid);
sewardjb5f6f512005-03-10 23:59:00 +0000626
sewardjb5f6f512005-03-10 23:59:00 +0000627// wait until all other threads are dead
628extern void VGA_(reap_threads)(ThreadId self);
629
630// handle an arch-specific client request
631extern Bool VGA_(client_request)(ThreadId tid, UWord *args);
632
nethercotefedd8102004-09-13 15:19:34 +0000633// Pointercheck
634extern Bool VGA_(setup_pointercheck) ( void );
635
636// For attaching the debugger
sewardj2a99cf62004-11-24 10:44:19 +0000637extern Int VGA_(ptrace_setregs_from_tst) ( Int pid, ThreadArchState* arch );
nethercotefedd8102004-09-13 15:19:34 +0000638
sewardjb5f6f512005-03-10 23:59:00 +0000639// Used by leakcheck
640extern void VGA_(mark_from_registers)(ThreadId tid, void (*marker)(Addr));
641
njn20242342005-05-16 23:31:24 +0000642// Set up the libc freeres wrapper
643extern void VGA_(intercept_libc_freeres_wrapper)(Addr);
644
645// Clean up the client by calling before the final reports
646extern void VGA_(final_tidyup)(ThreadId tid);
647
648// Arch-specific client requests
649extern Bool VGA_(client_requests)(ThreadId tid, UWord *args);
650
nethercote9b3c7652004-10-19 13:18:00 +0000651
sewardjb5f6f512005-03-10 23:59:00 +0000652///* ---------------------------------------------------------------------
653// Thread modelling
654// ------------------------------------------------------------------ */
655//extern void VG_(tm_thread_create) (ThreadId creator, ThreadId tid, Bool detached);
656//extern void VG_(tm_thread_exit) (ThreadId tid);
657//extern Bool VG_(tm_thread_exists) (ThreadId tid);
658//extern void VG_(tm_thread_detach) (ThreadId tid);
659//extern void VG_(tm_thread_join) (ThreadId joiner, ThreadId joinee);
660//extern void VG_(tm_thread_switchto)(ThreadId tid);
661//
662//extern void VG_(tm_mutex_init) (ThreadId tid, Addr mutexp);
663//extern void VG_(tm_mutex_destroy)(ThreadId tid, Addr mutexp);
664//extern void VG_(tm_mutex_trylock)(ThreadId tid, Addr mutexp);
665//extern void VG_(tm_mutex_giveup) (ThreadId tid, Addr mutexp);
666//extern void VG_(tm_mutex_acquire)(ThreadId tid, Addr mutexp);
667//extern void VG_(tm_mutex_tryunlock)(ThreadId tid, Addr mutexp);
668//extern void VG_(tm_mutex_unlock) (ThreadId tid, Addr mutexp);
669//extern Bool VG_(tm_mutex_exists) (Addr mutexp);
670//
671//extern UInt VG_(tm_error_update_extra) (Error *err);
672//extern Bool VG_(tm_error_equal) (VgRes res, Error *e1, Error *e2);
673//extern void VG_(tm_error_print) (Error *err);
674//
675//extern void VG_(tm_init) ();
676//
677//extern void VG_(tm_cond_init) (ThreadId tid, Addr condp);
678//extern void VG_(tm_cond_destroy) (ThreadId tid, Addr condp);
679//extern void VG_(tm_cond_wait) (ThreadId tid, Addr condp, Addr mutexp);
680//extern void VG_(tm_cond_wakeup) (ThreadId tid, Addr condp, Addr mutexp);
681//extern void VG_(tm_cond_signal) (ThreadId tid, Addr condp);
682//
683///* ----- pthreads ----- */
684//extern void VG_(pthread_init) ();
685//extern void VG_(pthread_startfunc_wrapper)(Addr wrapper);
686//
687//struct vg_pthread_newthread_data {
688// void *(*startfunc)(void *arg);
689// void *arg;
690//};
sewardj3b2736a2002-03-24 12:18:35 +0000691
692/* ---------------------------------------------------------------------
693 Finally - autoconf-generated settings
694 ------------------------------------------------------------------ */
695
696#include "config.h"
697
nethercotec06e2132004-09-03 13:45:29 +0000698#endif /* ndef __CORE_H */
699
sewardjde4a1d02002-03-22 01:27:54 +0000700/*--------------------------------------------------------------------*/
nethercote109d0df2004-09-02 08:10:13 +0000701/*--- end ---*/
sewardjde4a1d02002-03-22 01:27:54 +0000702/*--------------------------------------------------------------------*/