blob: 40ba16175a6b70704c9a5e8d34a1588695c81d9a [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
sewardj1d887112005-05-30 21:44:08 +0000348extern void VG_(shutdown_actions_NORETURN) (
349 ThreadId tid,
350 VgSchedReturnCode tids_schedretcode
351 );
sewardj2e93c502002-04-12 11:12:52 +0000352
353extern void VG_(scheduler_init) ( void );
354
sewardj15a43e12002-04-17 19:35:12 +0000355extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000356
nethercote75d26242004-08-01 22:59:18 +0000357// Longjmp back to the scheduler and thus enter the sighandler immediately.
sewardjb5f6f512005-03-10 23:59:00 +0000358extern void VG_(resume_scheduler) ( ThreadId tid );
sewardj2e93c502002-04-12 11:12:52 +0000359
sewardjb5f6f512005-03-10 23:59:00 +0000360/* If true, a fault is Valgrind-internal (ie, a bug) */
361extern Bool VG_(my_fault);
nethercote238a3c32004-08-09 13:13:31 +0000362
sewardj2e93c502002-04-12 11:12:52 +0000363/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000364 Exports of vg_signals.c
365 ------------------------------------------------------------------ */
366
sewardjb5f6f512005-03-10 23:59:00 +0000367/* Highest signal the kernel will let us use */
368extern Int VG_(max_signal);
jsgf855d93d2003-10-13 22:26:55 +0000369
sewardjde4a1d02002-03-22 01:27:54 +0000370extern void VG_(sigstartup_actions) ( void );
371
sewardjb5f6f512005-03-10 23:59:00 +0000372/* Poll a thread's set of pending signals, and update the Thread's context to deliver one */
373extern void VG_(poll_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000374
375/* Fake system calls for signal handling. */
njn502badb2005-05-08 02:04:49 +0000376extern Int VG_(do_sys_sigaltstack) ( ThreadId tid, vki_stack_t* ss,
377 vki_stack_t* oss );
378extern Int VG_(do_sys_sigaction) ( Int signo,
379 const struct vki_sigaction *new_act,
380 struct vki_sigaction *old_act );
381extern Int VG_(do_sys_sigprocmask) ( ThreadId tid, Int how,
382 vki_sigset_t* set,
383 vki_sigset_t* oldset );
sewardjefbfcdf2002-06-19 17:35:45 +0000384
njn444eba12005-05-12 03:47:31 +0000385extern void VG_(clear_out_queued_signals)
386 ( ThreadId tid, /* OUT */ vki_sigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000387
jsgf855d93d2003-10-13 22:26:55 +0000388extern void VG_(kill_self)(Int sigNo);
389
fitzhardingef1beb252004-03-16 09:49:08 +0000390/* These function synthesize a fault, as if the running instruction
391 had had a fault. These functions do not return - they longjmp back
392 into the scheduler so the signal can be delivered. */
393extern void VG_(synth_fault) (ThreadId tid);
394extern void VG_(synth_fault_mapping)(ThreadId tid, Addr addr);
395extern void VG_(synth_fault_perms) (ThreadId tid, Addr addr);
sewardj5e2f0012004-12-13 14:10:34 +0000396extern void VG_(synth_sigill) (ThreadId tid, Addr addr);
fitzhardingef1beb252004-03-16 09:49:08 +0000397
sewardjb5f6f512005-03-10 23:59:00 +0000398/* Extend the stack to cover addr, if possible */
399extern Bool VG_(extend_stack)(Addr addr, UInt maxsize);
400
401/* Returns True if the signal is OK for the client to use */
402extern Bool VG_(client_signal_OK)(Int sigNo);
403
404/* Forces the client's signal handler to SIG_DFL - generally just
405 before using that signal to kill the process. */
406extern void VG_(set_default_handler)(Int sig);
407
sewardjde4a1d02002-03-22 01:27:54 +0000408/* ---------------------------------------------------------------------
409 Exports of vg_mylibc.c
410 ------------------------------------------------------------------ */
411
njnca0518d2004-11-26 19:34:36 +0000412// Useful for making failing stubs, when certain things haven't yet been
413// implemented.
njn50ae1a72005-04-08 23:28:23 +0000414#define I_die_here \
sewardj0ab10c42005-05-12 08:26:36 +0000415 VG_(assert_fail) (/*isCore*//*BOGUS*/True, \
416 "Unimplemented functionality", \
njn50ae1a72005-04-08 23:28:23 +0000417 __FILE__, __LINE__, __PRETTY_FUNCTION__, \
418 "valgrind", VG_BUGS_TO, "")
njnca0518d2004-11-26 19:34:36 +0000419
njn50ae1a72005-04-08 23:28:23 +0000420#define vg_assert(expr) \
421 ((void) ((expr) ? 0 : \
422 (VG_(assert_fail) (/*isCore*/True, VG_STRINGIFY(expr), \
423 __FILE__, __LINE__, __PRETTY_FUNCTION__, \
424 ""), \
425 0)))
426
427#define vg_assert2(expr, format, args...) \
428 ((void) ((expr) ? 0 : \
429 (VG_(assert_fail) (/*isCore*/True, VG_STRINGIFY(expr), \
430 __FILE__, __LINE__, __PRETTY_FUNCTION__, \
431 format, ##args), \
432 0)))
433
njne427a662002-10-02 11:08:25 +0000434__attribute__ ((__noreturn__))
435extern void VG_(core_panic) ( Char* str );
thughes5876d552004-09-26 18:44:06 +0000436__attribute__ ((__noreturn__))
njnd01fef72005-03-25 23:35:48 +0000437extern void VG_(core_panic_at) ( Char* str, StackTrace ips );
sewardjde4a1d02002-03-22 01:27:54 +0000438
nethercote05675c82004-08-04 10:37:49 +0000439/* Tools use VG_(strdup)() which doesn't expose ArenaId */
njn25e49d8e72002-09-23 09:36:25 +0000440extern Char* VG_(arena_strdup) ( ArenaId aid, const Char* s);
sewardjde4a1d02002-03-22 01:27:54 +0000441
njn25e49d8e72002-09-23 09:36:25 +0000442extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
jsgf855d93d2003-10-13 22:26:55 +0000443extern Int VG_(poll)( struct vki_pollfd *, UInt nfds, Int timeout);
sewardj2e93c502002-04-12 11:12:52 +0000444
fitzhardinge98abfc72003-12-16 02:05:15 +0000445/* system/mman.h */
njn7df470b2005-05-29 18:46:38 +0000446extern void* VG_(mmap) ( void* start, SizeT length, UInt prot, UInt flags,
447 UInt sf_flags, UInt fd, OffT offset );
448extern void* VG_(mmap_native)( void* start, SizeT length, UInt prot, UInt flags,
449 UInt fd, OffT offset );
450extern Int VG_(munmap) ( void* start, SizeT length );
451extern Int VG_(mprotect) ( void *start, SizeT length, UInt prot );
sewardj79048ce2005-02-18 08:28:32 +0000452extern Int VG_(mprotect_native)( void *start, SizeT length, UInt prot );
fitzhardinge98abfc72003-12-16 02:05:15 +0000453
454
jsgf855d93d2003-10-13 22:26:55 +0000455/* Move an fd into the Valgrind-safe range */
456Int VG_(safe_fd)(Int oldfd);
457
sewardj570f8902002-11-03 11:44:36 +0000458extern Int VG_(write_socket)( Int sd, void *msg, Int count );
sewardj73cf3bc2002-11-03 03:20:15 +0000459
460/* --- Connecting over the network --- */
461extern Int VG_(connect_via_socket)( UChar* str );
462
fitzhardinge98abfc72003-12-16 02:05:15 +0000463/* Environment manipulations */
nethercote60a96c52004-08-03 13:08:31 +0000464extern Char **VG_(env_setenv) ( Char ***envp, const Char* varname,
465 const Char *val );
466extern void VG_(env_unsetenv) ( Char **env, const Char *varname );
467extern void VG_(env_remove_valgrind_env_stuff) ( Char** env );
sewardj570f8902002-11-03 11:44:36 +0000468
sewardjb5f6f512005-03-10 23:59:00 +0000469extern void VG_(nanosleep)(struct vki_timespec *);
njn2521d322005-05-08 14:45:13 +0000470
sewardj570f8902002-11-03 11:44:36 +0000471/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000472 Exports of vg_symtab2.c
473 ------------------------------------------------------------------ */
474
fitzhardinge98abfc72003-12-16 02:05:15 +0000475typedef struct _Segment Segment;
sewardjb5f6f512005-03-10 23:59:00 +0000476typedef struct _CodeRedirect CodeRedirect;
fitzhardinge98abfc72003-12-16 02:05:15 +0000477
478extern Bool VG_(is_object_file) ( const void *hdr );
fitzhardinge98abfc72003-12-16 02:05:15 +0000479extern SegInfo * VG_(read_seg_symbols) ( Segment *seg );
njn36ef6ba2005-05-14 18:42:26 +0000480extern void VG_(seginfo_incref) ( SegInfo * );
481extern void VG_(seginfo_decref) ( SegInfo *, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +0000482
njn25e49d8e72002-09-23 09:36:25 +0000483extern Bool VG_(get_fnname_nodemangle)( Addr a, Char* fnname, Int n_fnname );
sewardj25c7c3a2003-07-10 00:17:58 +0000484
sewardjb5f6f512005-03-10 23:59:00 +0000485extern Addr VG_(reverse_search_one_symtab) ( const SegInfo* si, const Char* name );
486
sewardj35165532005-04-30 18:47:48 +0000487extern Bool VG_(use_CFI_info) ( /*MOD*/Addr* ipP,
488 /*MOD*/Addr* spP,
489 /*MOD*/Addr* fpP,
490 Addr min_accessible,
491 Addr max_accessible );
492
493
sewardjb5f6f512005-03-10 23:59:00 +0000494/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000495 Exports of vg_main.c
496 ------------------------------------------------------------------ */
497
sewardj73cf3bc2002-11-03 03:20:15 +0000498/* Tell the logging mechanism whether we are logging to a file
499 descriptor or a socket descriptor. */
njnbe9b47b2005-05-15 16:22:58 +0000500extern Bool VG_(logging_to_socket);
sewardj73cf3bc2002-11-03 03:20:15 +0000501
njn25e49d8e72002-09-23 09:36:25 +0000502/* Sanity checks which may be done at any time. The scheduler decides when. */
nethercote885dd912004-08-03 23:14:00 +0000503extern void VG_(sanity_check_general) ( Bool force_expensive );
njn25e49d8e72002-09-23 09:36:25 +0000504
fitzhardinge98abfc72003-12-16 02:05:15 +0000505/* Address space */
506extern Addr VG_(client_base); /* client address space limits */
507extern Addr VG_(client_end);
508extern Addr VG_(client_mapbase); /* base of mappings */
509extern Addr VG_(clstk_base); /* client stack range */
510extern Addr VG_(clstk_end);
fitzhardinge92360792003-12-24 10:11:11 +0000511extern Addr VG_(client_trampoline_code);
512
fitzhardinge98abfc72003-12-16 02:05:15 +0000513extern Addr VG_(brk_base); /* start of brk */
514extern Addr VG_(brk_limit); /* current brk */
nethercote996901a2004-08-03 13:29:09 +0000515extern Addr VG_(shadow_base); /* tool's shadow memory */
fitzhardinge98abfc72003-12-16 02:05:15 +0000516extern Addr VG_(shadow_end);
517extern Addr VG_(valgrind_base); /* valgrind's address range */
nethercote820bd8c2004-09-07 23:04:49 +0000518extern Addr VG_(valgrind_last); // Nb: last byte, rather than one past the end
fitzhardinge98abfc72003-12-16 02:05:15 +0000519
nethercote73b526f2004-10-31 18:48:21 +0000520extern struct vki_rlimit VG_(client_rlimit_data); /* client's original rlimit data */
521extern struct vki_rlimit VG_(client_rlimit_stack); /* client's original rlimit stack */
fitzhardingeb50068f2004-02-24 23:42:55 +0000522
fitzhardingea49f9b52003-12-16 22:26:45 +0000523/* client executable file descriptor */
524extern Int VG_(clexecfd);
fitzhardinge98abfc72003-12-16 02:05:15 +0000525
nethercotef6a1d502004-08-09 12:21:57 +0000526// Help set up the child used when doing execve() with --trace-children=yes
527Char* VG_(build_child_VALGRINDCLO) ( Char* exename );
528Char* VG_(build_child_exename) ( void );
529
sewardjde4a1d02002-03-22 01:27:54 +0000530/* Called when some unhandleable client behaviour is detected.
531 Prints a msg and aborts. */
njn25e49d8e72002-09-23 09:36:25 +0000532extern void VG_(unimplemented) ( Char* msg )
533 __attribute__((__noreturn__));
sewardjde4a1d02002-03-22 01:27:54 +0000534
nethercote04d0fbc2004-01-26 16:48:06 +0000535/* Something of a function looking for a home ... start up debugger. */
njnc6168192004-11-29 13:54:10 +0000536extern void VG_(start_debugger) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000537
sewardj4ccf7072004-11-28 16:58:05 +0000538/* Stats ... */
nethercote844e7122004-08-02 15:27:22 +0000539extern void VG_(print_scheduler_stats) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000540
njn1f707722005-03-27 03:17:52 +0000541/* 64-bit counter for the number of basic blocks done. */
542extern ULong VG_(bbs_done);
543
nethercote2e05c332004-09-06 16:43:37 +0000544
sewardjde4a1d02002-03-22 01:27:54 +0000545/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000546 Exports of vg_syscall.S
547 ------------------------------------------------------------------ */
548
njnca6fef02004-11-29 16:49:18 +0000549// We use a full prototype rather than "..." here to ensure that all
550// arguments get converted to a UWord appropriately. Not doing so can
551// cause problems when passing 32-bit integers on 64-bit platforms, because
552// the top 32-bits might not be zeroed appropriately, eg. as would happen
553// with the 6th arg on AMD64 which is passed on the stack.
njnf4aeaea2004-11-29 17:33:31 +0000554extern Word VG_(do_syscall) ( UInt, UWord, UWord, UWord, UWord, UWord, UWord );
njnca6fef02004-11-29 16:49:18 +0000555
556// Macros make life easier.
557#define vgPlain_do_syscall0(s) VG_(do_syscall)((s),0,0,0,0,0,0)
558#define vgPlain_do_syscall1(s,a) VG_(do_syscall)((s),(a),0,0,0,0,0)
559#define vgPlain_do_syscall2(s,a,b) VG_(do_syscall)((s),(a),(b),0,0,0,0)
560#define vgPlain_do_syscall3(s,a,b,c) VG_(do_syscall)((s),(a),(b),(c),0,0,0)
561#define vgPlain_do_syscall4(s,a,b,c,d) VG_(do_syscall)((s),(a),(b),(c),(d),0,0)
562#define vgPlain_do_syscall5(s,a,b,c,d,e) VG_(do_syscall)((s),(a),(b),(c),(d),(e),0)
563#define vgPlain_do_syscall6(s,a,b,c,d,e,f) VG_(do_syscall)((s),(a),(b),(c),(d),(e),(f))
564
fitzhardinge4f10ada2004-06-03 10:00:42 +0000565extern void VG_(sigreturn)(void);
sewardjde4a1d02002-03-22 01:27:54 +0000566
567/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000568 Exports of vg_helpers.S
569 ------------------------------------------------------------------ */
570
fitzhardinge92360792003-12-24 10:11:11 +0000571/* Information about trampoline code (for signal return and syscalls) */
572extern const Char VG_(trampoline_code_start);
573extern const Int VG_(trampoline_code_length);
574extern const Int VG_(tramp_sigreturn_offset);
sewardjb5f6f512005-03-10 23:59:00 +0000575extern const Int VG_(tramp_rt_sigreturn_offset);
fitzhardinge92360792003-12-24 10:11:11 +0000576extern const Int VG_(tramp_syscall_offset);
tomee0bcbf2005-05-02 10:28:42 +0000577extern const Int VG_(tramp_gettimeofday_offset);
578extern const Int VG_(tramp_time_offset);
sewardj20917d82002-05-28 01:36:45 +0000579
nethercotec06e2132004-09-03 13:45:29 +0000580// ---------------------------------------------------------------------
581// Architecture-specific things defined in eg. x86/*.c
582// ---------------------------------------------------------------------
583
sewardj51ac0872004-12-21 01:20:49 +0000584// Returns the architecture and subarchitecture, or indicates
585// that this subarchitecture is unable to run Valgrind
586// Returns False to indicate we cannot proceed further.
sewardj51ac0872004-12-21 01:20:49 +0000587extern Bool VGA_(getArchAndSubArch)( /*OUT*/VexArch*,
588 /*OUT*/VexSubArch* );
njncf45fd42004-11-24 16:30:22 +0000589// Accessors for the ThreadArchState
njn35172bc2005-03-26 00:04:03 +0000590#define INSTR_PTR(regs) ((regs).vex.VGA_INSTR_PTR)
591#define STACK_PTR(regs) ((regs).vex.VGA_STACK_PTR)
592#define FRAME_PTR(regs) ((regs).vex.VGA_FRAME_PTR)
593#define CLREQ_ARGS(regs) ((regs).vex.VGA_CLREQ_ARGS)
njn35172bc2005-03-26 00:04:03 +0000594#define CLREQ_RET(regs) ((regs).vex.VGA_CLREQ_RET)
njn16de5572004-11-27 14:27:21 +0000595// Offsets for the Vex state
njn35172bc2005-03-26 00:04:03 +0000596#define O_STACK_PTR (offsetof(VexGuestArchState, VGA_STACK_PTR))
597#define O_FRAME_PTR (offsetof(VexGuestArchState, VGA_FRAME_PTR))
598#define O_CLREQ_RET (offsetof(VexGuestArchState, VGA_CLREQ_RET))
njncf45fd42004-11-24 16:30:22 +0000599
600
sewardj2a99cf62004-11-24 10:44:19 +0000601// Setting up the initial thread (1) state
602extern void
603 VGA_(init_thread1state) ( Addr client_eip,
604 Addr esp_at_startup,
605 /*MOD*/ ThreadArchState* arch );
sewardjde4a1d02002-03-22 01:27:54 +0000606
sewardjb5f6f512005-03-10 23:59:00 +0000607// OS/Platform-specific thread clear (after thread exit)
sewardj1d887112005-05-30 21:44:08 +0000608extern void VGO_(os_state_clear)(ThreadState *);
sewardjb5f6f512005-03-10 23:59:00 +0000609
610// OS/Platform-specific thread init (at scheduler init time)
sewardj1d887112005-05-30 21:44:08 +0000611extern void VGO_(os_state_init)(ThreadState *);
sewardjb5f6f512005-03-10 23:59:00 +0000612
sewardj1d887112005-05-30 21:44:08 +0000613// Run a thread from beginning to end.
614extern VgSchedReturnCode VGO_(thread_wrapper)(Word /*ThreadId*/ tid);
sewardjb5f6f512005-03-10 23:59:00 +0000615
sewardj1d887112005-05-30 21:44:08 +0000616// Call here to exit the entire Valgrind system.
617extern void VGO_(terminate_NORETURN)(ThreadId tid, VgSchedReturnCode src);
618
619// Allocates a stack for the first thread, then runs it,
620// as if the thread had been set up by clone()
621extern void VGP_(main_thread_wrapper_NORETURN)(ThreadId tid);
sewardjb5f6f512005-03-10 23:59:00 +0000622
623// Return how many bytes of a thread's Valgrind stack are unused
sewardj1d887112005-05-30 21:44:08 +0000624extern SSizeT VGA_(stack_unused)(ThreadId tid);
sewardjb5f6f512005-03-10 23:59:00 +0000625
sewardjb5f6f512005-03-10 23:59:00 +0000626// wait until all other threads are dead
627extern void VGA_(reap_threads)(ThreadId self);
628
629// handle an arch-specific client request
630extern Bool VGA_(client_request)(ThreadId tid, UWord *args);
631
nethercotefedd8102004-09-13 15:19:34 +0000632// Pointercheck
633extern Bool VGA_(setup_pointercheck) ( void );
634
635// For attaching the debugger
sewardj2a99cf62004-11-24 10:44:19 +0000636extern Int VGA_(ptrace_setregs_from_tst) ( Int pid, ThreadArchState* arch );
nethercotefedd8102004-09-13 15:19:34 +0000637
sewardjb5f6f512005-03-10 23:59:00 +0000638// Used by leakcheck
639extern void VGA_(mark_from_registers)(ThreadId tid, void (*marker)(Addr));
640
njn20242342005-05-16 23:31:24 +0000641// Set up the libc freeres wrapper
642extern void VGA_(intercept_libc_freeres_wrapper)(Addr);
643
644// Clean up the client by calling before the final reports
645extern void VGA_(final_tidyup)(ThreadId tid);
646
647// Arch-specific client requests
648extern Bool VGA_(client_requests)(ThreadId tid, UWord *args);
649
nethercote9b3c7652004-10-19 13:18:00 +0000650
sewardjb5f6f512005-03-10 23:59:00 +0000651///* ---------------------------------------------------------------------
652// Thread modelling
653// ------------------------------------------------------------------ */
654//extern void VG_(tm_thread_create) (ThreadId creator, ThreadId tid, Bool detached);
655//extern void VG_(tm_thread_exit) (ThreadId tid);
656//extern Bool VG_(tm_thread_exists) (ThreadId tid);
657//extern void VG_(tm_thread_detach) (ThreadId tid);
658//extern void VG_(tm_thread_join) (ThreadId joiner, ThreadId joinee);
659//extern void VG_(tm_thread_switchto)(ThreadId tid);
660//
661//extern void VG_(tm_mutex_init) (ThreadId tid, Addr mutexp);
662//extern void VG_(tm_mutex_destroy)(ThreadId tid, Addr mutexp);
663//extern void VG_(tm_mutex_trylock)(ThreadId tid, Addr mutexp);
664//extern void VG_(tm_mutex_giveup) (ThreadId tid, Addr mutexp);
665//extern void VG_(tm_mutex_acquire)(ThreadId tid, Addr mutexp);
666//extern void VG_(tm_mutex_tryunlock)(ThreadId tid, Addr mutexp);
667//extern void VG_(tm_mutex_unlock) (ThreadId tid, Addr mutexp);
668//extern Bool VG_(tm_mutex_exists) (Addr mutexp);
669//
670//extern UInt VG_(tm_error_update_extra) (Error *err);
671//extern Bool VG_(tm_error_equal) (VgRes res, Error *e1, Error *e2);
672//extern void VG_(tm_error_print) (Error *err);
673//
674//extern void VG_(tm_init) ();
675//
676//extern void VG_(tm_cond_init) (ThreadId tid, Addr condp);
677//extern void VG_(tm_cond_destroy) (ThreadId tid, Addr condp);
678//extern void VG_(tm_cond_wait) (ThreadId tid, Addr condp, Addr mutexp);
679//extern void VG_(tm_cond_wakeup) (ThreadId tid, Addr condp, Addr mutexp);
680//extern void VG_(tm_cond_signal) (ThreadId tid, Addr condp);
681//
682///* ----- pthreads ----- */
683//extern void VG_(pthread_init) ();
684//extern void VG_(pthread_startfunc_wrapper)(Addr wrapper);
685//
686//struct vg_pthread_newthread_data {
687// void *(*startfunc)(void *arg);
688// void *arg;
689//};
sewardj3b2736a2002-03-24 12:18:35 +0000690
691/* ---------------------------------------------------------------------
692 Finally - autoconf-generated settings
693 ------------------------------------------------------------------ */
694
695#include "config.h"
696
nethercotec06e2132004-09-03 13:45:29 +0000697#endif /* ndef __CORE_H */
698
sewardjde4a1d02002-03-22 01:27:54 +0000699/*--------------------------------------------------------------------*/
nethercote109d0df2004-09-02 08:10:13 +0000700/*--- end ---*/
sewardjde4a1d02002-03-22 01:27:54 +0000701/*--------------------------------------------------------------------*/