From: Julian Seward Date: Fri, 20 Jan 2006 15:17:20 +0000 (+0000) Subject: Make amd64 function wrapping work again following recent changes. X-Git-Tag: svn/VALGRIND_3_2_0~341 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=83c10ad5b78cb4fd83080a0c961e65cd3374a86e;p=thirdparty%2Fvalgrind.git Make amd64 function wrapping work again following recent changes. Includes expected outputs for wrap8 for the non ppc64-linux case. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5570 --- diff --git a/include/valgrind.h b/include/valgrind.h index 2ec274d588..6200669ae4 100644 --- a/include/valgrind.h +++ b/include/valgrind.h @@ -166,6 +166,13 @@ /* ---------------------------- x86 ---------------------------- */ #if defined(ARCH_x86) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + #define __SPECIAL_INSTRUCTION_PREAMBLE \ "roll $3, %%edi ; roll $13, %%edi\n\t" \ "roll $29, %%edi ; roll $19, %%edi\n\t" @@ -190,8 +197,9 @@ _zzq_rlval = _zzq_result; \ } -#define VALGRIND_GET_NRADDR(_zzq_rlval) \ - { volatile unsigned int __addr; \ +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned int __addr; \ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ /* %EAX = guest_NRADDR */ \ "xchgl %%ecx,%%ecx" \ @@ -199,7 +207,7 @@ : \ : "cc", "memory" \ ); \ - _zzq_rlval = (void*)__addr; \ + _zzq_orig->nraddr = __addr; \ } #define VALGRIND_CALL_NOREDIR_EAX \ @@ -211,6 +219,13 @@ /* --------------------------- amd64 --------------------------- */ #if defined(ARCH_amd64) + +typedef + struct { + unsigned long long int nraddr; /* where's the code? */ + } + OrigFn; + #define __SPECIAL_INSTRUCTION_PREAMBLE \ "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" @@ -235,8 +250,9 @@ _zzq_rlval = _zzq_result; \ } -#define VALGRIND_GET_NRADDR(_zzq_rlval) \ - { volatile unsigned long long int __addr; \ +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned long long int __addr; \ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ /* %RAX = guest_NRADDR */ \ "xchgq %%rcx,%%rcx" \ @@ -244,7 +260,7 @@ : \ : "cc", "memory" \ ); \ - _zzq_rlval = (void*)__addr; \ + _zzq_orig->nraddr = __addr; \ } #define VALGRIND_CALL_NOREDIR_RAX \ @@ -259,7 +275,7 @@ typedef struct { - unsigned long int nraddr; /* where's the code? */ + unsigned int nraddr; /* where's the code? */ } OrigFn; @@ -703,12 +719,12 @@ typedef /* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned long) == 8. */ -#define CALL_FN_W_v(lval, fnptr) \ +#define CALL_FN_W_v(lval, orig) \ do { \ - volatile void* _fnptr = (fnptr); \ + volatile OrigFn _orig = (orig); \ volatile unsigned long _argvec[1]; \ volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_fnptr; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ __asm__ volatile( \ "movq (%%rax), %%rax\n\t" /* target->%rax */ \ VALGRIND_CALL_NOREDIR_RAX \ @@ -719,12 +735,12 @@ typedef lval = (__typeof__(lval)) _res; \ } while (0) -#define CALL_FN_W_W(lval, fnptr, arg1) \ +#define CALL_FN_W_W(lval, orig, arg1) \ do { \ - volatile void* _fnptr = (fnptr); \ + volatile OrigFn _orig = (orig); \ volatile unsigned long _argvec[2]; \ volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_fnptr; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ _argvec[1] = (unsigned long)(arg1); \ __asm__ volatile( \ "movq 8(%%rax), %%rdi\n\t" \ @@ -737,12 +753,12 @@ typedef lval = (__typeof__(lval)) _res; \ } while (0) -#define CALL_FN_W_WW(lval, fnptr, arg1,arg2) \ +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ do { \ - volatile void* _fnptr = (fnptr); \ + volatile OrigFn _orig = (orig); \ volatile unsigned long _argvec[3]; \ volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_fnptr; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ _argvec[1] = (unsigned long)(arg1); \ _argvec[2] = (unsigned long)(arg2); \ __asm__ volatile( \ diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index ee9f7de92e..77e998a53a 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -116,6 +116,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ wrap6.vgtest wrap6.stdout.exp wrap6.stderr.exp \ wrap7.vgtest wrap7.stdout.exp wrap7.stderr.exp \ wrap8.vgtest wrap8.stdout.exp wrap8.stderr.exp \ + wrap8.stdout.exp2 wrap8.stderr.exp2 \ writev.stderr.exp writev.stderr.exp2 writev.stderr.exp3 writev.vgtest \ xml1.stderr.exp xml1.stderr.exp2 xml1.stderr.exp3 \ xml1.stderr.exp64 xml1.stderr.exp64_2 xml1.stdout.exp \ diff --git a/memcheck/tests/wrap8.stderr.exp2 b/memcheck/tests/wrap8.stderr.exp2 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/memcheck/tests/wrap8.stdout.exp2 b/memcheck/tests/wrap8.stdout.exp2 new file mode 100644 index 0000000000..e0afd09c60 --- /dev/null +++ b/memcheck/tests/wrap8.stdout.exp2 @@ -0,0 +1,77 @@ +computing fact1(15) +in wrapper1-pre: fact(15) +in wrapper2-pre: fact(14) +in wrapper1-pre: fact(13) +in wrapper2-pre: fact(12) +in wrapper1-pre: fact(11) +in wrapper2-pre: fact(10) +in wrapper1-pre: fact(9) +in wrapper2-pre: fact(8) +in wrapper1-pre: fact(7) +in wrapper2-pre: fact(6) +in wrapper1-pre: fact(5) +in wrapper2-pre: fact(4) +in wrapper1-pre: fact(3) +in wrapper2-pre: fact(2) +in wrapper1-pre: fact(1) +in wrapper2-pre: fact(0) +in wrapper2-post: fact(0) = 1 +in wrapper1-post: fact(1) = 1 +in wrapper2-post: fact(2) = 2 +in wrapper1-post: fact(3) = 6 +in wrapper2-pre: fact(2) +in wrapper1-pre: fact(1) +in wrapper2-pre: fact(0) +in wrapper2-post: fact(0) = 1 +in wrapper1-post: fact(1) = 1 +in wrapper2-post: fact(2) = 2 +in wrapper2-post: fact(4) = 32 +in wrapper1-post: fact(5) = 160 +in wrapper2-pre: fact(2) +in wrapper1-pre: fact(1) +in wrapper2-pre: fact(0) +in wrapper2-post: fact(0) = 1 +in wrapper1-post: fact(1) = 1 +in wrapper2-post: fact(2) = 2 +in wrapper2-post: fact(6) = 972 +in wrapper1-post: fact(7) = 6804 +in wrapper2-pre: fact(2) +in wrapper1-pre: fact(1) +in wrapper2-pre: fact(0) +in wrapper2-post: fact(0) = 1 +in wrapper1-post: fact(1) = 1 +in wrapper2-post: fact(2) = 2 +in wrapper2-post: fact(8) = 54448 +in wrapper1-post: fact(9) = 490032 +in wrapper2-pre: fact(2) +in wrapper1-pre: fact(1) +in wrapper2-pre: fact(0) +in wrapper2-post: fact(0) = 1 +in wrapper1-post: fact(1) = 1 +in wrapper2-post: fact(2) = 2 +in wrapper2-post: fact(10) = 4900340 +in wrapper1-post: fact(11) = 53903740 +in wrapper2-pre: fact(2) +in wrapper1-pre: fact(1) +in wrapper2-pre: fact(0) +in wrapper2-post: fact(0) = 1 +in wrapper1-post: fact(1) = 1 +in wrapper2-post: fact(2) = 2 +in wrapper2-post: fact(12) = 646844904 +in wrapper1-post: fact(13) = -180950840 +in wrapper2-pre: fact(2) +in wrapper1-pre: fact(1) +in wrapper2-pre: fact(0) +in wrapper2-post: fact(0) = 1 +in wrapper1-post: fact(1) = 1 +in wrapper2-post: fact(2) = 2 +in wrapper2-post: fact(14) = 1761655564 +in wrapper1-post: fact(15) = 655029684 +in wrapper2-pre: fact(2) +in wrapper1-pre: fact(1) +in wrapper2-pre: fact(0) +in wrapper2-post: fact(0) = 1 +in wrapper1-post: fact(1) = 1 +in wrapper2-post: fact(2) = 2 +fact1(15) = 655029686 +allocated 111 Lards