blob: c9e75afc74e824be69aa59121deb9407c28766a6 [file] [log] [blame]
sewardjde4a1d02002-03-22 01:27:54 +00001
2/*
njn25e49d8e72002-09-23 09:36:25 +00003 ----------------------------------------------------------------
4
5 Notice that the following BSD-style license applies to this one
6 file (valgrind.h) only. The entire rest of Valgrind is licensed
7 under the terms of the GNU General Public License, version 2. See
8 the COPYING file in the source distribution for details.
9
10 ----------------------------------------------------------------
11
njnc9539842002-10-02 13:26:35 +000012 This file is part of Valgrind, an extensible x86 protected-mode
13 emulator for monitoring program execution on x86-Unixes.
sewardjde4a1d02002-03-22 01:27:54 +000014
njn25e49d8e72002-09-23 09:36:25 +000015 Copyright (C) 2000-2002 Julian Seward. All rights reserved.
sewardjde4a1d02002-03-22 01:27:54 +000016
njn25e49d8e72002-09-23 09:36:25 +000017 Redistribution and use in source and binary forms, with or without
18 modification, are permitted provided that the following conditions
19 are met:
sewardjde4a1d02002-03-22 01:27:54 +000020
njn25e49d8e72002-09-23 09:36:25 +000021 1. Redistributions of source code must retain the above copyright
22 notice, this list of conditions and the following disclaimer.
sewardjde4a1d02002-03-22 01:27:54 +000023
njn25e49d8e72002-09-23 09:36:25 +000024 2. The origin of this software must not be misrepresented; you must
25 not claim that you wrote the original software. If you use this
26 software in a product, an acknowledgment in the product
27 documentation would be appreciated but is not required.
sewardjde4a1d02002-03-22 01:27:54 +000028
njn25e49d8e72002-09-23 09:36:25 +000029 3. Altered source versions must be plainly marked as such, and must
30 not be misrepresented as being the original software.
31
32 4. The name of the author may not be used to endorse or promote
33 products derived from this software without specific prior written
34 permission.
35
36 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
37 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
38 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
40 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
42 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
43 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
44 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47
48 ----------------------------------------------------------------
49
50 Notice that the above BSD-style license applies to this one file
51 (valgrind.h) only. The entire rest of Valgrind is licensed under
52 the terms of the GNU General Public License, version 2. See the
53 COPYING file in the source distribution for details.
54
55 ----------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +000056*/
57
58
59#ifndef __VALGRIND_H
60#define __VALGRIND_H
61
62
sewardj6591dc22003-03-15 19:12:43 +000063#ifndef __VALGRIND_SOMESKIN_H
sewardj34a257c2003-03-15 19:20:52 +000064 #warning For valgrind versions 1.9.0 and after,
65 #warning you should not include valgrind.h directly.
66 #warning Instead include the .h relevant to the skin
67 #warning you want to use. For most people this means
68 #warning you need to include memcheck.h instead of
69 #warning valgrind.h.
70 #error Compilation of your source will now abort.
sewardj6591dc22003-03-15 19:12:43 +000071#endif
72
73
sewardjde4a1d02002-03-22 01:27:54 +000074/* This file is for inclusion into client (your!) code.
75
njn25e49d8e72002-09-23 09:36:25 +000076 You can use these macros to manipulate and query Valgrind's
77 execution inside your own programs.
sewardjde4a1d02002-03-22 01:27:54 +000078
79 The resulting executables will still run without Valgrind, just a
80 little bit more slowly than they otherwise would, but otherwise
sewardj285f77f2003-03-15 23:39:11 +000081 unchanged. When not running on valgrind, each client request
82 consumes about 9 x86 instructions, so the resulting performance
83 loss is negligible unless you plan to execute client requests
84 millions of times per second. Nevertheless, if that is still a
85 problem, you can compile with the NVALGRIND symbol defined (gcc
86 -DNVALGRIND) so that client requests are not even compiled in. */
sewardjde4a1d02002-03-22 01:27:54 +000087
88
89
sewardj37091fb2002-11-16 11:06:50 +000090#ifndef NVALGRIND
sewardjde4a1d02002-03-22 01:27:54 +000091/* This defines the magic code sequence which the JITter spots and
92 handles magically. Don't look too closely at this; it will rot
sewardj2e93c502002-04-12 11:12:52 +000093 your brain. Valgrind dumps the result value in %EDX, so we first
94 copy the default value there, so that it is returned when not
95 running on Valgrind. Since %EAX points to a block of mem
96 containing the args, you can pass as many args as you want like
97 this. Currently this is set up to deal with 4 args since that's
98 the max that we appear to need (pthread_create).
sewardjde4a1d02002-03-22 01:27:54 +000099*/
sewardj2e93c502002-04-12 11:12:52 +0000100#define VALGRIND_MAGIC_SEQUENCE( \
101 _zzq_rlval, /* result lvalue */ \
102 _zzq_default, /* result returned when running on real CPU */ \
103 _zzq_request, /* request code */ \
104 _zzq_arg1, /* request first param */ \
105 _zzq_arg2, /* request second param */ \
106 _zzq_arg3, /* request third param */ \
107 _zzq_arg4 /* request fourth param */ ) \
108 \
109 { volatile unsigned int _zzq_args[5]; \
sewardj18d75132002-05-16 11:06:21 +0000110 _zzq_args[0] = (volatile unsigned int)(_zzq_request); \
111 _zzq_args[1] = (volatile unsigned int)(_zzq_arg1); \
112 _zzq_args[2] = (volatile unsigned int)(_zzq_arg2); \
113 _zzq_args[3] = (volatile unsigned int)(_zzq_arg3); \
114 _zzq_args[4] = (volatile unsigned int)(_zzq_arg4); \
sewardj2e93c502002-04-12 11:12:52 +0000115 asm volatile("movl %1, %%eax\n\t" \
116 "movl %2, %%edx\n\t" \
117 "roll $29, %%eax ; roll $3, %%eax\n\t" \
118 "rorl $27, %%eax ; rorl $5, %%eax\n\t" \
119 "roll $13, %%eax ; roll $19, %%eax\n\t" \
120 "movl %%edx, %0\t" \
121 : "=r" (_zzq_rlval) \
122 : "r" (&_zzq_args[0]), "r" (_zzq_default) \
123 : "eax", "edx", "cc", "memory" \
124 ); \
125 }
sewardj37091fb2002-11-16 11:06:50 +0000126#else /* NVALGRIND */
127/* Define NVALGRIND to completely remove the Valgrind magic sequence
128 from the compiled code (analogous to NDEBUG's effects on
129 assert()) */
130#define VALGRIND_MAGIC_SEQUENCE( \
131 _zzq_rlval, /* result lvalue */ \
132 _zzq_default, /* result returned when running on real CPU */ \
133 _zzq_request, /* request code */ \
134 _zzq_arg1, /* request first param */ \
135 _zzq_arg2, /* request second param */ \
136 _zzq_arg3, /* request third param */ \
137 _zzq_arg4 /* request fourth param */ ) \
138 { \
139 (_zzq_rlval) = (_zzq_default); \
140 }
141#endif /* NVALGRIND */
sewardj2e93c502002-04-12 11:12:52 +0000142
143/* Some request codes. There are many more of these, but most are not
144 exposed to end-user view. These are the public ones, all of the
njn25e49d8e72002-09-23 09:36:25 +0000145 form 0x1000 + small_number.
sewardj2e93c502002-04-12 11:12:52 +0000146*/
147
sewardj34042512002-10-22 04:14:35 +0000148#define VG_USERREQ_SKIN_BASE(a,b) ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
149#define VG_IS_SKIN_USERREQ(a, b, v) (VG_USERREQ_SKIN_BASE(a,b) == ((v) & 0xffff0000))
150
njn25e49d8e72002-09-23 09:36:25 +0000151typedef
152 enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
153 VG_USERREQ__DISCARD_TRANSLATIONS,
njn3e884182003-04-15 13:03:23 +0000154
155 /* These allow any function of 0--3 args to be called from the
156 simulated CPU but run on the real CPU */
157 VG_USERREQ__CLIENT_CALL0 = 0x1100,
158 VG_USERREQ__CLIENT_CALL1,
159 VG_USERREQ__CLIENT_CALL2,
160 VG_USERREQ__CLIENT_CALL3,
161
162 /* As above, but a pointer to the current ThreadState is inserted
163 as the first arg. */
164 VG_USERREQ__CLIENT_tstCALL0 = 0x1200,
165 VG_USERREQ__CLIENT_tstCALL1,
166 VG_USERREQ__CLIENT_tstCALL2,
167 VG_USERREQ__CLIENT_tstCALL3,
168
sewardj34a257c2003-03-15 19:20:52 +0000169 VG_USERREQ__FINAL_DUMMY_CLIENT_REQUEST
njn25e49d8e72002-09-23 09:36:25 +0000170 } Vg_ClientRequest;
sewardj2e93c502002-04-12 11:12:52 +0000171
172
173/* Returns 1 if running on Valgrind, 0 if running on the real CPU.
174 Currently implemented but untested. */
175#define RUNNING_ON_VALGRIND \
176 ({unsigned int _qzz_res; \
177 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0 /* returned if not */, \
178 VG_USERREQ__RUNNING_ON_VALGRIND, \
179 0, 0, 0, 0); \
180 _qzz_res; \
sewardjde4a1d02002-03-22 01:27:54 +0000181 })
182
183
sewardj18d75132002-05-16 11:06:21 +0000184/* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
185 _qzz_len - 1]. Useful if you are debugging a JITter or some such,
186 since it provides a way to make sure valgrind will retranslate the
187 invalidated area. Returns no value. */
188#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
189 {unsigned int _qzz_res; \
190 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
191 VG_USERREQ__DISCARD_TRANSLATIONS, \
192 _qzz_addr, _qzz_len, 0, 0); \
193 }
194
195
njn3e884182003-04-15 13:03:23 +0000196/* These requests allow control to move from the simulated CPU to the
197 real CPU, calling an arbitary function */
198#define VG_NON_SIMD_CALL0(_qyy_fn) \
199 ({unsigned int _qyy_res; \
200 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
201 VG_USERREQ__CLIENT_CALL0, \
202 _qyy_fn, \
203 0, 0, 0); \
204 _qyy_res; \
205 })
206
207#define VG_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
208 ({unsigned int _qyy_res; \
209 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
210 VG_USERREQ__CLIENT_CALL1, \
211 _qyy_fn, \
212 _qyy_arg1, 0, 0); \
213 _qyy_res; \
214 })
215
216#define VG_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
217 ({unsigned int _qyy_res; \
218 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
219 VG_USERREQ__CLIENT_CALL2, \
220 _qyy_fn, \
221 _qyy_arg1, _qyy_arg2, 0); \
222 _qyy_res; \
223 })
224
225#define VG_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
226 ({unsigned int _qyy_res; \
227 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
228 VG_USERREQ__CLIENT_CALL3, \
229 _qyy_fn, \
230 _qyy_arg1, _qyy_arg2, _qyy_arg3); \
231 _qyy_res; \
232 })
233
234
235/* These requests are similar to those above; they insert the current
236 ThreadState as the first argument to the called function. */
237#define VG_NON_SIMD_tstCALL0(_qyy_fn) \
238 ({unsigned int _qyy_res; \
239 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
240 VG_USERREQ__CLIENT_tstCALL0, \
241 _qyy_fn, \
242 0, 0, 0); \
243 _qyy_res; \
244 })
245
246#define VG_NON_SIMD_tstCALL1(_qyy_fn, _qyy_arg1) \
247 ({unsigned int _qyy_res; \
248 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
249 VG_USERREQ__CLIENT_tstCALL1, \
250 _qyy_fn, \
251 _qyy_arg1, 0, 0); \
252 _qyy_res; \
253 })
254
255#define VG_NON_SIMD_tstCALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
256 ({unsigned int _qyy_res; \
257 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
258 VG_USERREQ__CLIENT_tstCALL2, \
259 _qyy_fn, \
260 _qyy_arg1, _qyy_arg2, 0); \
261 _qyy_res; \
262 })
263
264#define VG_NON_SIMD_tstCALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
265 ({unsigned int _qyy_res; \
266 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
267 VG_USERREQ__CLIENT_tstCALL3, \
268 _qyy_fn, \
269 _qyy_arg1, _qyy_arg2, _qyy_arg3); \
270 _qyy_res; \
271 })
272
273
274#endif /* __VALGRIND_H */