|
From: <sv...@va...> - 2006-01-10 20:40:18
|
Author: sewardj
Date: 2006-01-10 20:40:11 +0000 (Tue, 10 Jan 2006)
New Revision: 5512
Log:
Make function wrapping work on ppc32-linux.
Modified:
branches/FNWRAP/coregrind/m_redir.c
branches/FNWRAP/coregrind/m_scheduler/scheduler.c
branches/FNWRAP/include/valgrind.h
Modified: branches/FNWRAP/coregrind/m_redir.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/FNWRAP/coregrind/m_redir.c 2006-01-10 16:21:07 UTC (rev 5511=
)
+++ branches/FNWRAP/coregrind/m_redir.c 2006-01-10 20:40:11 UTC (rev 5512=
)
@@ -753,11 +753,11 @@
if (0=3D=3DVG_(strcmp)("Memcheck", VG_(details).name)) {
add_hardwired_spec(
"ld.so.1", "strlen",
- (Addr)&VG_(ppc32_linux_REDIR_FOR_strlen),
+ (Addr)&VG_(ppc32_linux_REDIR_FOR_strlen)
); =20
add_hardwired_spec(
"soname:ld.so.1", "strcmp",
- (Addr)&VG_(ppc32_linux_REDIR_FOR_strcmp),
+ (Addr)&VG_(ppc32_linux_REDIR_FOR_strcmp)
);
}
=20
Modified: branches/FNWRAP/coregrind/m_scheduler/scheduler.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/FNWRAP/coregrind/m_scheduler/scheduler.c 2006-01-10 16:21:07=
UTC (rev 5511)
+++ branches/FNWRAP/coregrind/m_scheduler/scheduler.c 2006-01-10 20:40:11=
UTC (rev 5512)
@@ -643,6 +643,67 @@
" ret\n"
".previous\n"
);
+#elif defined(VGP_ppc32_linux)
+asm("\n"
+".text\n"
+"run_a_translation:\n"
+" stwu 1,-256(1)\n"
+" stw 14,128(1)\n"
+" stw 15,132(1)\n"
+" stw 16,136(1)\n"
+" stw 17,140(1)\n"
+" stw 18,144(1)\n"
+" stw 19,148(1)\n"
+" stw 20,152(1)\n"
+" stw 21,156(1)\n"
+" stw 22,160(1)\n"
+" stw 23,164(1)\n"
+" stw 24,168(1)\n"
+" stw 25,172(1)\n"
+" stw 26,176(1)\n"
+" stw 27,180(1)\n"
+" stw 28,184(1)\n"
+" stw 29,188(1)\n"
+" stw 30,192(1)\n"
+" stw 31,196(1)\n"
+" mflr 31\n"
+" stw 31,200(1)\n"
+
+" stw 3,204(1)\n"
+" lwz 31,4(3)\n"
+" lwz 30,0(3)\n"
+" mtlr 30\n"
+" blrl\n"
+
+" lwz 4,204(1)\n"
+" stw 3, 8(4)\n"
+" stw 31,12(4)\n"
+
+" lwz 14,128(1)\n"
+" lwz 15,132(1)\n"
+" lwz 16,136(1)\n"
+" lwz 17,140(1)\n"
+" lwz 18,144(1)\n"
+" lwz 19,148(1)\n"
+" lwz 20,152(1)\n"
+" lwz 21,156(1)\n"
+" lwz 22,160(1)\n"
+" lwz 23,164(1)\n"
+" lwz 24,168(1)\n"
+" lwz 25,172(1)\n"
+" lwz 26,176(1)\n"
+" lwz 27,180(1)\n"
+" lwz 28,184(1)\n"
+" lwz 29,188(1)\n"
+" lwz 30,192(1)\n"
+" lwz 31,200(1)\n"
+" mtlr 31\n"
+" lwz 31,196(1)\n"
+" addi 1,1,256\n"
+" blr\n"
+
+".previous\n"
+);
#else
# error "Not implemented"
#endif
Modified: branches/FNWRAP/include/valgrind.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/FNWRAP/include/valgrind.h 2006-01-10 16:21:07 UTC (rev 5511)
+++ branches/FNWRAP/include/valgrind.h 2006-01-10 20:40:11 UTC (rev 5512)
@@ -200,7 +200,7 @@
#define VALGRIND_CALL_NOREDIR_EAX \
__SPECIAL_INSTRUCTION_PREAMBLE \
/* call-noredir *%EAX */ \
- "xchgl %%edx,%%edx\n\t"
+ "xchgl %%edx,%%edx"
#endif /* ARCH_x86 */
=20
/* --------------------------- amd64 --------------------------- */
@@ -245,36 +245,54 @@
#define VALGRIND_CALL_NOREDIR_RAX \
__SPECIAL_INSTRUCTION_PREAMBLE \
/* call-noredir *%RAX */ \
- "xchgq %%rdx,%%rdx\n\t"
+ "xchgq %%rdx,%%rdx"
#endif /* ARCH_amd64 */
=20
/* --------------------------- ppc32 --------------------------- */
=20
#if defined(ARCH_ppc32)
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
+ "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" \
+
#define VALGRIND_DO_CLIENT_REQUEST( \
_zzq_rlval, _zzq_default, _zzq_request, \
_zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
\
{ volatile unsigned int _zzq_args[5]; \
- register unsigned int _zzq_tmp __asm__("r3"); \
+ register unsigned int _zzq_result __asm__("r3"); \
register volatile unsigned int *_zzq_ptr __asm__("r4"); \
- _zzq_args[0] =3D (volatile unsigned int)(_zzq_request); \
- _zzq_args[1] =3D (volatile unsigned int)(_zzq_arg1); \
- _zzq_args[2] =3D (volatile unsigned int)(_zzq_arg2); \
- _zzq_args[3] =3D (volatile unsigned int)(_zzq_arg3); \
- _zzq_args[4] =3D (volatile unsigned int)(_zzq_arg4); \
+ _zzq_args[0] =3D (unsigned int)(_zzq_request); \
+ _zzq_args[1] =3D (unsigned int)(_zzq_arg1); \
+ _zzq_args[2] =3D (unsigned int)(_zzq_arg2); \
+ _zzq_args[3] =3D (unsigned int)(_zzq_arg3); \
+ _zzq_args[4] =3D (unsigned int)(_zzq_arg4); \
_zzq_ptr =3D _zzq_args; \
- __asm__ volatile("tw 0,3,27\n\t" \
- "rlwinm 0,0,29,0,0\n\t" \
- "rlwinm 0,0,3,0,0\n\t" \
- "rlwinm 0,0,13,0,0\n\t" \
- "rlwinm 0,0,19,0,0\n\t" \
- "nop\n\t" \
- : "=3Dr" (_zzq_tmp) \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %R3 =3D client_request ( %R4 ) */ \
+ "or 1,1,1" \
+ : "=3Dr" (_zzq_result) \
: "0" (_zzq_default), "r" (_zzq_ptr) \
- : "memory"); \
- _zzq_rlval =3D (__typeof__(_zzq_rlval)) _zzq_tmp; \
+ : "cc", "memory"); \
+ _zzq_rlval =3D _zzq_result; \
}
+
+#define VALGRIND_GET_NRADDR(_zzq_rlval) \
+ { register unsigned int __addr __asm__("r3"); \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %R3 =3D guest_NRADDR */ \
+ "or 2,2,2" \
+ : "=3Dr" (__addr) \
+ : \
+ : "cc", "memory" \
+ ); \
+ _zzq_rlval =3D (void*)__addr; \
+ }
+
+#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* branch-and-link-to-noredir *%R11 */ \
+ "or 3,3,3\n\t"
#endif /* ARCH_ppc32 */
=20
/* --------------------------- ppc64 --------------------------- */
@@ -693,6 +711,76 @@
=20
/* --------------------------- ppc32 --------------------------- */
=20
+/* 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 ppc32-linux, sizeof(unsigned
+ long) =3D=3D 4. */
+
+#define CALL_FN_W_v(lval, fnptr) \
+ do { \
+ volatile void* _fnptr =3D (fnptr); \
+ volatile unsigned long _argvec[1]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ __asm__ volatile( \
+ "mr 11,%1\n\t" \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr %0,3" \
+ : /*out*/ "=3Dr" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_W(lval, fnptr, arg1) \
+ do { \
+ volatile void* _fnptr =3D (fnptr); \
+ volatile unsigned long _argvec[2]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)arg1; \
+ __asm__ volatile( \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr %0,3" \
+ : /*out*/ "=3Dr" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WW(lval, fnptr, arg1,arg2) \
+ do { \
+ volatile void* _fnptr =3D (fnptr); \
+ volatile unsigned long _argvec[3]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)arg1; \
+ _argvec[2] =3D (unsigned long)arg2; \
+ __asm__ volatile( \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr %0,3" \
+ : /*out*/ "=3Dr" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
/* --------------------------- ppc64 --------------------------- */
=20
=20
|