|
From: <sv...@va...> - 2006-03-11 16:19:18
|
Author: sewardj
Date: 2006-03-11 16:19:14 +0000 (Sat, 11 Mar 2006)
New Revision: 5748
Log:
Complete CALL_FN_W_* wrappers for amd64-linux.
Modified:
trunk/include/valgrind.h
Modified: trunk/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
--- trunk/include/valgrind.h 2006-03-11 13:20:41 UTC (rev 5747)
+++ trunk/include/valgrind.h 2006-03-11 16:19:14 UTC (rev 5748)
@@ -919,6 +919,328 @@
lval =3D (__typeof__(lval)) _res; \
} while (0)
=20
+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[4]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ __asm__ volatile( \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[5]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ __asm__ volatile( \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[6]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ __asm__ volatile( \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[7]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ __asm__ volatile( \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[8]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ _argvec[7] =3D (unsigned long)(arg7); \
+ __asm__ volatile( \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ "addq $8, %%rsp\n" \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[9]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ _argvec[7] =3D (unsigned long)(arg7); \
+ _argvec[8] =3D (unsigned long)(arg8); \
+ __asm__ volatile( \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ "addq $16, %%rsp\n" \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[10]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ _argvec[7] =3D (unsigned long)(arg7); \
+ _argvec[8] =3D (unsigned long)(arg8); \
+ _argvec[9] =3D (unsigned long)(arg9); \
+ __asm__ volatile( \
+ "pushq 72(%%rax)\n\t" \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ "addq $24, %%rsp\n" \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[11]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ _argvec[7] =3D (unsigned long)(arg7); \
+ _argvec[8] =3D (unsigned long)(arg8); \
+ _argvec[9] =3D (unsigned long)(arg9); \
+ _argvec[10] =3D (unsigned long)(arg10); \
+ __asm__ volatile( \
+ "pushq 80(%%rax)\n\t" \
+ "pushq 72(%%rax)\n\t" \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ "addq $32, %%rsp\n" \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[12]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ _argvec[7] =3D (unsigned long)(arg7); \
+ _argvec[8] =3D (unsigned long)(arg8); \
+ _argvec[9] =3D (unsigned long)(arg9); \
+ _argvec[10] =3D (unsigned long)(arg10); \
+ _argvec[11] =3D (unsigned long)(arg11); \
+ __asm__ volatile( \
+ "pushq 88(%%rax)\n\t" \
+ "pushq 80(%%rax)\n\t" \
+ "pushq 72(%%rax)\n\t" \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ "addq $40, %%rsp\n" \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11,arg12) \
+ do { \
+ volatile OrigFn _orig =3D (orig); \
+ volatile unsigned long _argvec[13]; \
+ volatile unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_orig.nraddr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ _argvec[7] =3D (unsigned long)(arg7); \
+ _argvec[8] =3D (unsigned long)(arg8); \
+ _argvec[9] =3D (unsigned long)(arg9); \
+ _argvec[10] =3D (unsigned long)(arg10); \
+ _argvec[11] =3D (unsigned long)(arg11); \
+ _argvec[12] =3D (unsigned long)(arg12); \
+ __asm__ volatile( \
+ "pushq 96(%%rax)\n\t" \
+ "pushq 88(%%rax)\n\t" \
+ "pushq 80(%%rax)\n\t" \
+ "pushq 72(%%rax)\n\t" \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ "addq $48, %%rsp\n" \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
#endif /* ARCH_amd64 */
=20
/* --------------------------- ppc32 --------------------------- */
|