OLD | NEW |
1 /* -*- c -*- | 1 /* -*- c -*- |
2 ---------------------------------------------------------------- | 2 ---------------------------------------------------------------- |
3 | 3 |
4 Notice that the following BSD-style license applies to this one | 4 Notice that the following BSD-style license applies to this one |
5 file (valgrind.h) only. The rest of Valgrind is licensed under the | 5 file (valgrind.h) only. The rest of Valgrind is licensed under the |
6 terms of the GNU General Public License, version 2, unless | 6 terms of the GNU General Public License, version 2, unless |
7 otherwise indicated. See the COPYING file in the source | 7 otherwise indicated. See the COPYING file in the source |
8 distribution for details. | 8 distribution for details. |
9 | 9 |
10 ---------------------------------------------------------------- | 10 ---------------------------------------------------------------- |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 consumes very few (eg. 7) instructions, so the resulting performance | 67 consumes very few (eg. 7) instructions, so the resulting performance |
68 loss is negligible unless you plan to execute client requests | 68 loss is negligible unless you plan to execute client requests |
69 millions of times per second. Nevertheless, if that is still a | 69 millions of times per second. Nevertheless, if that is still a |
70 problem, you can compile with the NVALGRIND symbol defined (gcc | 70 problem, you can compile with the NVALGRIND symbol defined (gcc |
71 -DNVALGRIND) so that client requests are not even compiled in. */ | 71 -DNVALGRIND) so that client requests are not even compiled in. */ |
72 | 72 |
73 #ifndef __VALGRIND_H | 73 #ifndef __VALGRIND_H |
74 #define __VALGRIND_H | 74 #define __VALGRIND_H |
75 | 75 |
76 #include <stdarg.h> | 76 #include <stdarg.h> |
| 77 #include <stdint.h> |
77 | 78 |
78 /* Nb: this file might be included in a file compiled with -ansi. So | 79 /* Nb: this file might be included in a file compiled with -ansi. So |
79 we can't use C++ style "//" comments nor the "asm" keyword (instead | 80 we can't use C++ style "//" comments nor the "asm" keyword (instead |
80 use "__asm__"). */ | 81 use "__asm__"). */ |
81 | 82 |
82 /* Derive some tags indicating what the target platform is. Note | 83 /* Derive some tags indicating what the target platform is. Note |
83 that in this file we're using the compiler's CPP symbols for | 84 that in this file we're using the compiler's CPP symbols for |
84 identifying architectures, which are different to the ones we use | 85 identifying architectures, which are different to the ones we use |
85 within the rest of Valgrind. Note, __powerpc__ is active for both | 86 within the rest of Valgrind. Note, __powerpc__ is active for both |
86 32 and 64-bit PPC, whereas __powerpc64__ is only active for the | 87 32 and 64-bit PPC, whereas __powerpc64__ is only active for the |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 /* call-noredir *%EAX */ \ | 226 /* call-noredir *%EAX */ \ |
226 "xchgl %%edx,%%edx\n\t" | 227 "xchgl %%edx,%%edx\n\t" |
227 #endif /* PLAT_x86_linux */ | 228 #endif /* PLAT_x86_linux */ |
228 | 229 |
229 /* ------------------------ amd64-linux ------------------------ */ | 230 /* ------------------------ amd64-linux ------------------------ */ |
230 | 231 |
231 #if defined(PLAT_amd64_linux) | 232 #if defined(PLAT_amd64_linux) |
232 | 233 |
233 typedef | 234 typedef |
234 struct { | 235 struct { |
235 unsigned long long int nraddr; /* where's the code? */ | 236 uint64_t nraddr; /* where's the code? */ |
236 } | 237 } |
237 OrigFn; | 238 OrigFn; |
238 | 239 |
239 #define __SPECIAL_INSTRUCTION_PREAMBLE \ | 240 #define __SPECIAL_INSTRUCTION_PREAMBLE \ |
240 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ | 241 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ |
241 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" | 242 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" |
242 | 243 |
243 #define VALGRIND_DO_CLIENT_REQUEST( \ | 244 #define VALGRIND_DO_CLIENT_REQUEST( \ |
244 _zzq_rlval, _zzq_default, _zzq_request, \ | 245 _zzq_rlval, _zzq_default, _zzq_request, \ |
245 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ | 246 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
246 { volatile unsigned long long int _zzq_args[6]; \ | 247 { volatile uint64_t _zzq_args[6]; \ |
247 volatile unsigned long long int _zzq_result; \ | 248 volatile uint64_t _zzq_result; \ |
248 _zzq_args[0] = (unsigned long long int)(_zzq_request); \ | 249 _zzq_args[0] = (uint64_t)(_zzq_request); \ |
249 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ | 250 _zzq_args[1] = (uint64_t)(_zzq_arg1); \ |
250 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ | 251 _zzq_args[2] = (uint64_t)(_zzq_arg2); \ |
251 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ | 252 _zzq_args[3] = (uint64_t)(_zzq_arg3); \ |
252 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ | 253 _zzq_args[4] = (uint64_t)(_zzq_arg4); \ |
253 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ | 254 _zzq_args[5] = (uint64_t)(_zzq_arg5); \ |
254 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ | 255 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
255 /* %RDX = client_request ( %RAX ) */ \ | 256 /* %RDX = client_request ( %RAX ) */ \ |
256 "xchgq %%rbx,%%rbx" \ | 257 "xchgq %%rbx,%%rbx" \ |
257 : "=d" (_zzq_result) \ | 258 : "=d" (_zzq_result) \ |
258 : "a" (&_zzq_args[0]), "0" (_zzq_default) \ | 259 : "a" (&_zzq_args[0]), "0" (_zzq_default) \ |
259 : "cc", "memory" \ | 260 : "cc", "memory" \ |
260 ); \ | 261 ); \ |
261 _zzq_rlval = _zzq_result; \ | 262 _zzq_rlval = _zzq_result; \ |
262 } | 263 } |
263 | 264 |
264 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ | 265 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ |
265 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ | 266 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ |
266 volatile unsigned long long int __addr; \ | 267 volatile uint64_t __addr; \ |
267 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ | 268 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
268 /* %RAX = guest_NRADDR */ \ | 269 /* %RAX = guest_NRADDR */ \ |
269 "xchgq %%rcx,%%rcx" \ | 270 "xchgq %%rcx,%%rcx" \ |
270 : "=a" (__addr) \ | 271 : "=a" (__addr) \ |
271 : \ | 272 : \ |
272 : "cc", "memory" \ | 273 : "cc", "memory" \ |
273 ); \ | 274 ); \ |
274 _zzq_orig->nraddr = __addr; \ | 275 _zzq_orig->nraddr = __addr; \ |
275 } | 276 } |
276 | 277 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 /* branch-and-link-to-noredir *%R11 */ \ | 340 /* branch-and-link-to-noredir *%R11 */ \ |
340 "or 3,3,3\n\t" | 341 "or 3,3,3\n\t" |
341 #endif /* PLAT_ppc32_linux */ | 342 #endif /* PLAT_ppc32_linux */ |
342 | 343 |
343 /* ------------------------ ppc64-linux ------------------------ */ | 344 /* ------------------------ ppc64-linux ------------------------ */ |
344 | 345 |
345 #if defined(PLAT_ppc64_linux) | 346 #if defined(PLAT_ppc64_linux) |
346 | 347 |
347 typedef | 348 typedef |
348 struct { | 349 struct { |
349 unsigned long long int nraddr; /* where's the code? */ | 350 uint64_t nraddr; /* where's the code? */ |
350 unsigned long long int r2; /* what tocptr do we need? */ | 351 uint64_t r2; /* what tocptr do we need? */ |
351 } | 352 } |
352 OrigFn; | 353 OrigFn; |
353 | 354 |
354 #define __SPECIAL_INSTRUCTION_PREAMBLE \ | 355 #define __SPECIAL_INSTRUCTION_PREAMBLE \ |
355 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ | 356 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ |
356 "rotldi 0,0,61 ; rotldi 0,0,51\n\t" | 357 "rotldi 0,0,61 ; rotldi 0,0,51\n\t" |
357 | 358 |
358 #define VALGRIND_DO_CLIENT_REQUEST( \ | 359 #define VALGRIND_DO_CLIENT_REQUEST( \ |
359 _zzq_rlval, _zzq_default, _zzq_request, \ | 360 _zzq_rlval, _zzq_default, _zzq_request, \ |
360 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ | 361 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
361 \ | 362 \ |
362 { unsigned long long int _zzq_args[6]; \ | 363 { uint64_t _zzq_args[6]; \ |
363 register unsigned long long int _zzq_result __asm__("r3"); \ | 364 register uint64_t _zzq_result __asm__("r3"); \ |
364 register unsigned long long int* _zzq_ptr __asm__("r4"); \ | 365 register uint64_t* _zzq_ptr __asm__("r4"); \ |
365 _zzq_args[0] = (unsigned long long int)(_zzq_request); \ | 366 _zzq_args[0] = (uint64_t)(_zzq_request); \ |
366 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ | 367 _zzq_args[1] = (uint64_t)(_zzq_arg1); \ |
367 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ | 368 _zzq_args[2] = (uint64_t)(_zzq_arg2); \ |
368 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ | 369 _zzq_args[3] = (uint64_t)(_zzq_arg3); \ |
369 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ | 370 _zzq_args[4] = (uint64_t)(_zzq_arg4); \ |
370 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ | 371 _zzq_args[5] = (uint64_t)(_zzq_arg5); \ |
371 _zzq_ptr = _zzq_args; \ | 372 _zzq_ptr = _zzq_args; \ |
372 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ | 373 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
373 /* %R3 = client_request ( %R4 ) */ \ | 374 /* %R3 = client_request ( %R4 ) */ \ |
374 "or 1,1,1" \ | 375 "or 1,1,1" \ |
375 : "=r" (_zzq_result) \ | 376 : "=r" (_zzq_result) \ |
376 : "0" (_zzq_default), "r" (_zzq_ptr) \ | 377 : "0" (_zzq_default), "r" (_zzq_ptr) \ |
377 : "cc", "memory"); \ | 378 : "cc", "memory"); \ |
378 _zzq_rlval = _zzq_result; \ | 379 _zzq_rlval = _zzq_result; \ |
379 } | 380 } |
380 | 381 |
381 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ | 382 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ |
382 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ | 383 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ |
383 register unsigned long long int __addr __asm__("r3"); \ | 384 register uint64_t __addr __asm__("r3"); \ |
384 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ | 385 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
385 /* %R3 = guest_NRADDR */ \ | 386 /* %R3 = guest_NRADDR */ \ |
386 "or 2,2,2" \ | 387 "or 2,2,2" \ |
387 : "=r" (__addr) \ | 388 : "=r" (__addr) \ |
388 : \ | 389 : \ |
389 : "cc", "memory" \ | 390 : "cc", "memory" \ |
390 ); \ | 391 ); \ |
391 _zzq_orig->nraddr = __addr; \ | 392 _zzq_orig->nraddr = __addr; \ |
392 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ | 393 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
393 /* %R3 = guest_NRADDR_GPR2 */ \ | 394 /* %R3 = guest_NRADDR_GPR2 */ \ |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 "or 3,3,3\n\t" | 478 "or 3,3,3\n\t" |
478 | 479 |
479 #endif /* PLAT_ppc32_aix5 */ | 480 #endif /* PLAT_ppc32_aix5 */ |
480 | 481 |
481 /* ------------------------ ppc64-aix5 ------------------------- */ | 482 /* ------------------------ ppc64-aix5 ------------------------- */ |
482 | 483 |
483 #if defined(PLAT_ppc64_aix5) | 484 #if defined(PLAT_ppc64_aix5) |
484 | 485 |
485 typedef | 486 typedef |
486 struct { | 487 struct { |
487 unsigned long long int nraddr; /* where's the code? */ | 488 uint64_t nraddr; /* where's the code? */ |
488 unsigned long long int r2; /* what tocptr do we need? */ | 489 uint64_t r2; /* what tocptr do we need? */ |
489 } | 490 } |
490 OrigFn; | 491 OrigFn; |
491 | 492 |
492 #define __SPECIAL_INSTRUCTION_PREAMBLE \ | 493 #define __SPECIAL_INSTRUCTION_PREAMBLE \ |
493 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ | 494 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ |
494 "rotldi 0,0,61 ; rotldi 0,0,51\n\t" | 495 "rotldi 0,0,61 ; rotldi 0,0,51\n\t" |
495 | 496 |
496 #define VALGRIND_DO_CLIENT_REQUEST( \ | 497 #define VALGRIND_DO_CLIENT_REQUEST( \ |
497 _zzq_rlval, _zzq_default, _zzq_request, \ | 498 _zzq_rlval, _zzq_default, _zzq_request, \ |
498 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ | 499 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
499 \ | 500 \ |
500 { unsigned long long int _zzq_args[7]; \ | 501 { uint64_t _zzq_args[7]; \ |
501 register unsigned long long int _zzq_result; \ | 502 register uint64_t _zzq_result; \ |
502 register unsigned long long int* _zzq_ptr; \ | 503 register uint64_t* _zzq_ptr; \ |
503 _zzq_args[0] = (unsigned int long long)(_zzq_request); \ | 504 _zzq_args[0] = (unsigned int long long)(_zzq_request); \ |
504 _zzq_args[1] = (unsigned int long long)(_zzq_arg1); \ | 505 _zzq_args[1] = (unsigned int long long)(_zzq_arg1); \ |
505 _zzq_args[2] = (unsigned int long long)(_zzq_arg2); \ | 506 _zzq_args[2] = (unsigned int long long)(_zzq_arg2); \ |
506 _zzq_args[3] = (unsigned int long long)(_zzq_arg3); \ | 507 _zzq_args[3] = (unsigned int long long)(_zzq_arg3); \ |
507 _zzq_args[4] = (unsigned int long long)(_zzq_arg4); \ | 508 _zzq_args[4] = (unsigned int long long)(_zzq_arg4); \ |
508 _zzq_args[5] = (unsigned int long long)(_zzq_arg5); \ | 509 _zzq_args[5] = (unsigned int long long)(_zzq_arg5); \ |
509 _zzq_args[6] = (unsigned int long long)(_zzq_default); \ | 510 _zzq_args[6] = (unsigned int long long)(_zzq_default); \ |
510 _zzq_ptr = _zzq_args; \ | 511 _zzq_ptr = _zzq_args; \ |
511 __asm__ volatile("mr 4,%1\n\t" \ | 512 __asm__ volatile("mr 4,%1\n\t" \ |
512 "ld 3, 48(4)\n\t" \ | 513 "ld 3, 48(4)\n\t" \ |
513 __SPECIAL_INSTRUCTION_PREAMBLE \ | 514 __SPECIAL_INSTRUCTION_PREAMBLE \ |
514 /* %R3 = client_request ( %R4 ) */ \ | 515 /* %R3 = client_request ( %R4 ) */ \ |
515 "or 1,1,1\n\t" \ | 516 "or 1,1,1\n\t" \ |
516 "mr %0,3" \ | 517 "mr %0,3" \ |
517 : "=b" (_zzq_result) \ | 518 : "=b" (_zzq_result) \ |
518 : "b" (_zzq_ptr) \ | 519 : "b" (_zzq_ptr) \ |
519 : "r3", "r4", "cc", "memory"); \ | 520 : "r3", "r4", "cc", "memory"); \ |
520 _zzq_rlval = _zzq_result; \ | 521 _zzq_rlval = _zzq_result; \ |
521 } | 522 } |
522 | 523 |
523 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ | 524 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ |
524 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ | 525 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ |
525 register unsigned long long int __addr; \ | 526 register uint64_t __addr; \ |
526 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ | 527 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
527 /* %R3 = guest_NRADDR */ \ | 528 /* %R3 = guest_NRADDR */ \ |
528 "or 2,2,2\n\t" \ | 529 "or 2,2,2\n\t" \ |
529 "mr %0,3" \ | 530 "mr %0,3" \ |
530 : "=b" (__addr) \ | 531 : "=b" (__addr) \ |
531 : \ | 532 : \ |
532 : "r3", "cc", "memory" \ | 533 : "r3", "cc", "memory" \ |
533 ); \ | 534 ); \ |
534 _zzq_orig->nraddr = __addr; \ | 535 _zzq_orig->nraddr = __addr; \ |
535 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ | 536 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
(...skipping 3379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3915 | 3916 |
3916 | 3917 |
3917 #undef PLAT_x86_linux | 3918 #undef PLAT_x86_linux |
3918 #undef PLAT_amd64_linux | 3919 #undef PLAT_amd64_linux |
3919 #undef PLAT_ppc32_linux | 3920 #undef PLAT_ppc32_linux |
3920 #undef PLAT_ppc64_linux | 3921 #undef PLAT_ppc64_linux |
3921 #undef PLAT_ppc32_aix5 | 3922 #undef PLAT_ppc32_aix5 |
3922 #undef PLAT_ppc64_aix5 | 3923 #undef PLAT_ppc64_aix5 |
3923 | 3924 |
3924 #endif /* __VALGRIND_H */ | 3925 #endif /* __VALGRIND_H */ |
OLD | NEW |