From 61c4ef43b3f62f43fbb96b2c77583059271ebc9c Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Tue, 17 Jan 2006 01:49:37 +0000 Subject: [PATCH] ppc64-linux function wrapping support (does not work properly) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5529 --- include/valgrind.h | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/include/valgrind.h b/include/valgrind.h index 0865fa95d1..21dee6c21d 100644 --- a/include/valgrind.h +++ b/include/valgrind.h @@ -806,6 +806,89 @@ /* --------------------------- ppc64 --------------------------- */ +#if defined(ARCH_ppc64) + +/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS "lr", \ + "r0", "r2", "r3", "r4", "r5", "r6", \ + "r7", "r8", "r9", "r10", "r11", "r12" + +/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned + long) == 8. */ + +#define CALL_FN_W_v(lval, fnptr) \ + do { \ + volatile void* _fnptr = (fnptr); \ + volatile unsigned long _argvec[1+1]; \ + volatile unsigned long _res; \ + _argvec[1+0] = (unsigned long)_fnptr; \ + __asm__ volatile( \ + "mr 11,%1\n\t" \ + "std 2,-8(11)\n\t" /* save tocptr */ \ + "ld 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-8(11)" /* restore tocptr */ \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[1+0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, fnptr, arg1) \ + do { \ + volatile void* _fnptr = (fnptr); \ + volatile unsigned long _argvec[1+2]; \ + volatile unsigned long _res; \ + _argvec[1+0] = (unsigned long)_fnptr; \ + _argvec[1+1] = (unsigned long)arg1; \ + __asm__ volatile( \ + "mr 11,%1\n\t" \ + "std 2,-8(11)\n\t" /* save tocptr */ \ + "ld 3,8(11)\n\t" /* arg1->r3 */ \ + "ld 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-8(11)" /* restore tocptr */ \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[1+0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, fnptr, arg1,arg2) \ + do { \ + volatile void* _fnptr = (fnptr); \ + volatile unsigned long _argvec[1+3]; \ + volatile unsigned long _res; \ + _argvec[1+0] = (unsigned long)_fnptr; \ + _argvec[1+1] = (unsigned long)arg1; \ + _argvec[1+2] = (unsigned long)arg1; \ + __asm__ volatile( \ + "mr 11,%1\n\t" \ + "std 2,-8(11)\n\t" /* save tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4,16(11)\n\t" \ + "ld 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-8(11)" /* restore tocptr */ \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[1+0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* ARCH_ppc64 */ + /* ------------------------------------------------------------------ */ /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ -- 2.47.2