diff --git a/.gitignore b/.gitignore index af1de1c..1865a99 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -/wine-mono-4.5.6.tar.gz +/wine-mono-4.6.0.tar.gz diff --git a/sources b/sources index bdcbe7f..c4158e7 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -f8f1e78bf3e454a9f4c88d7470642736 wine-mono-4.5.6.tar.gz +dc63164de4e7c06fbb5a619a105477fc wine-mono-4.6.0.tar.gz diff --git a/wine-mono-tls.patch b/wine-mono-tls.patch deleted file mode 100644 index 893afec..0000000 --- a/wine-mono-tls.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/mono/utils/mono-compiler.h 2015-02-27 16:42:27.000000000 -0600 -+++ b/mono/utils/mono-compiler.h 2015-04-23 10:52:44.137887962 -0500 -@@ -13,7 +13,7 @@ - #define MONO_FAST_TLS_SET(x,y) x = y - #define MONO_FAST_TLS_GET(x) x - #define MONO_FAST_TLS_INIT(x) --#define MONO_FAST_TLS_DECLARE(x) static __thread gpointer x MONO_TLS_FAST; -+#define MONO_FAST_TLS_DECLARE(x) static __thread gpointer __attribute__((used)) x MONO_TLS_FAST; - - #if HAVE_TLS_MODEL_ATTR - ---- a/mono/metadata/sgen-alloc.c 2015-04-23 11:03:09.641290545 -0500 -+++ b/mono/metadata/sgen-alloc.c 2015-04-23 11:02:56.601136395 -0500 -@@ -94,7 +94,7 @@ - static __thread char *tlab_temp_end; - static __thread char *tlab_real_end; - /* Used by the managed allocator/wbarrier */ --static __thread char **tlab_next_addr; -+static __thread char __attribute__((used)) **tlab_next_addr; - #endif - - #ifdef HAVE_KW_THREAD diff --git a/wine-mono-valgrind.patch b/wine-mono-valgrind.patch deleted file mode 100644 index 4c4ac90..0000000 --- a/wine-mono-valgrind.patch +++ /dev/null @@ -1,3505 +0,0 @@ -From 1445d4821c8091c395264542344dca9df22a2c82 Mon Sep 17 00:00:00 2001 -From: Zoltan Varga -Date: Thu, 5 Feb 2015 20:53:21 -0500 -Subject: [PATCH] [runtime] Update valgrind headers to the ones from valgrind - 3.10.1. Fixes #26688. - ---- - mono/utils/memcheck.h | 17 +- - mono/utils/valgrind.h | 2864 +++++++++++++++++++++++++++++++++++++++---------- - 2 files changed, 2288 insertions(+), 593 deletions(-) - -diff --git a/mono/utils/memcheck.h b/mono/utils/memcheck.h -index fcc7644..2740578 100644 ---- a/mono/utils/memcheck.h -+++ b/mono/utils/memcheck.h -@@ -13,7 +13,7 @@ - This file is part of MemCheck, a heavyweight Valgrind tool for - detecting memory errors. - -- Copyright (C) 2000-2012 Julian Seward. All rights reserved. -+ Copyright (C) 2000-2013 Julian Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions -@@ -96,6 +96,9 @@ typedef - /* Not next to VG_USERREQ__COUNT_LEAKS because it was added later. */ - VG_USERREQ__COUNT_LEAK_BLOCKS, - -+ VG_USERREQ__ENABLE_ADDR_ERROR_REPORTING_IN_RANGE, -+ VG_USERREQ__DISABLE_ADDR_ERROR_REPORTING_IN_RANGE, -+ - /* This is just for memcheck's internal use - don't use it */ - _VG_USERREQ__MEMCHECK_RECORD_OVERLAP_ERROR - = VG_USERREQ_TOOL_BASE('M','C') + 256 -@@ -283,5 +286,17 @@ typedef - (const char*)(zzvbits), \ - (zznbytes), 0, 0 ) - -+/* Disable and re-enable reporting of addressing errors in the -+ specified address range. */ -+#define VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(_qzz_addr,_qzz_len) \ -+ VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ -+ VG_USERREQ__DISABLE_ADDR_ERROR_REPORTING_IN_RANGE, \ -+ (_qzz_addr), (_qzz_len), 0, 0, 0) -+ -+#define VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(_qzz_addr,_qzz_len) \ -+ VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ -+ VG_USERREQ__ENABLE_ADDR_ERROR_REPORTING_IN_RANGE, \ -+ (_qzz_addr), (_qzz_len), 0, 0, 0) -+ - #endif - -diff --git a/mono/utils/valgrind.h b/mono/utils/valgrind.h -index 315da5b..6954d75 100644 ---- a/mono/utils/valgrind.h -+++ b/mono/utils/valgrind.h -@@ -12,7 +12,7 @@ - This file is part of Valgrind, a dynamic binary instrumentation - framework. - -- Copyright (C) 2000-2012 Julian Seward. All rights reserved. -+ Copyright (C) 2000-2013 Julian Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions -@@ -89,7 +89,7 @@ - || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6)) - */ - #define __VALGRIND_MAJOR__ 3 --#define __VALGRIND_MINOR__ 8 -+#define __VALGRIND_MINOR__ 10 - - - #include -@@ -111,35 +111,51 @@ - #undef PLAT_x86_darwin - #undef PLAT_amd64_darwin - #undef PLAT_x86_win32 -+#undef PLAT_amd64_win64 - #undef PLAT_x86_linux - #undef PLAT_amd64_linux - #undef PLAT_ppc32_linux --#undef PLAT_ppc64_linux -+#undef PLAT_ppc64be_linux -+#undef PLAT_ppc64le_linux - #undef PLAT_arm_linux -+#undef PLAT_arm64_linux - #undef PLAT_s390x_linux - #undef PLAT_mips32_linux -+#undef PLAT_mips64_linux - - - #if defined(__APPLE__) && defined(__i386__) - # define PLAT_x86_darwin 1 - #elif defined(__APPLE__) && defined(__x86_64__) - # define PLAT_amd64_darwin 1 --#elif defined(__MINGW32__) || defined(__CYGWIN32__) \ -+#elif (defined(__MINGW32__) && !defined(__MINGW64__)) \ -+ || defined(__CYGWIN32__) \ - || (defined(_WIN32) && defined(_M_IX86)) - # define PLAT_x86_win32 1 -+#elif defined(__MINGW64__) \ -+ || (defined(_WIN64) && defined(_M_X64)) -+# define PLAT_amd64_win64 1 - #elif defined(__linux__) && defined(__i386__) - # define PLAT_x86_linux 1 - #elif defined(__linux__) && defined(__x86_64__) - # define PLAT_amd64_linux 1 - #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__) - # define PLAT_ppc32_linux 1 --#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) --# define PLAT_ppc64_linux 1 --#elif defined(__linux__) && defined(__arm__) -+#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF != 2 -+/* Big Endian uses ELF version 1 */ -+# define PLAT_ppc64be_linux 1 -+#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF == 2 -+/* Little Endian uses ELF version 2 */ -+# define PLAT_ppc64le_linux 1 -+#elif defined(__linux__) && defined(__arm__) && !defined(__aarch64__) - # define PLAT_arm_linux 1 -+#elif defined(__linux__) && defined(__aarch64__) && !defined(__arm__) -+# define PLAT_arm64_linux 1 - #elif defined(__linux__) && defined(__s390__) && defined(__s390x__) - # define PLAT_s390x_linux 1 --#elif defined(__linux__) && defined(__mips__) -+#elif defined(__linux__) && defined(__mips__) && (__mips==64) -+# define PLAT_mips64_linux 1 -+#elif defined(__linux__) && defined(__mips__) && (__mips!=64) - # define PLAT_mips32_linux 1 - #else - /* If we're not compiling for our target platform, don't generate -@@ -368,7 +384,8 @@ valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request, - - /* ------------------------ amd64-{linux,darwin} --------------- */ - --#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) -+#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) \ -+ || (defined(PLAT_amd64_win64) && defined(__GNUC__)) - - typedef - struct { -@@ -430,6 +447,14 @@ typedef - - #endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ - -+/* ------------------------- amd64-Win64 ------------------------- */ -+ -+#if defined(PLAT_amd64_win64) && !defined(__GNUC__) -+ -+#error Unsupported compiler. -+ -+#endif /* PLAT_amd64_win64 */ -+ - /* ------------------------ ppc32-linux ------------------------ */ - - #if defined(PLAT_ppc32_linux) -@@ -441,8 +466,8 @@ typedef - OrigFn; - - #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" -+ "rlwinm 0,0,3,0,31 ; rlwinm 0,0,13,0,31\n\t" \ -+ "rlwinm 0,0,29,0,31 ; rlwinm 0,0,19,0,31\n\t" - - #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ -@@ -501,7 +526,7 @@ typedef - - /* ------------------------ ppc64-linux ------------------------ */ - --#if defined(PLAT_ppc64_linux) -+#if defined(PLAT_ppc64be_linux) - - typedef - struct { -@@ -576,7 +601,84 @@ typedef - ); \ - } while (0) - --#endif /* PLAT_ppc64_linux */ -+#endif /* PLAT_ppc64be_linux */ -+ -+#if defined(PLAT_ppc64le_linux) -+ -+typedef -+ struct { -+ unsigned long long int nraddr; /* where's the code? */ -+ unsigned long long int r2; /* what tocptr do we need? */ -+ } -+ OrigFn; -+ -+#define __SPECIAL_INSTRUCTION_PREAMBLE \ -+ "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ -+ "rotldi 0,0,61 ; rotldi 0,0,51\n\t" -+ -+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ -+ _zzq_default, _zzq_request, \ -+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ -+ \ -+ __extension__ \ -+ ({ unsigned long long int _zzq_args[6]; \ -+ unsigned long long int _zzq_result; \ -+ unsigned long long int* _zzq_ptr; \ -+ _zzq_args[0] = (unsigned long long int)(_zzq_request); \ -+ _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ -+ _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ -+ _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ -+ _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ -+ _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ -+ _zzq_ptr = _zzq_args; \ -+ __asm__ volatile("mr 3,%1\n\t" /*default*/ \ -+ "mr 4,%2\n\t" /*ptr*/ \ -+ __SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* %R3 = client_request ( %R4 ) */ \ -+ "or 1,1,1\n\t" \ -+ "mr %0,3" /*result*/ \ -+ : "=b" (_zzq_result) \ -+ : "b" (_zzq_default), "b" (_zzq_ptr) \ -+ : "cc", "memory", "r3", "r4"); \ -+ _zzq_result; \ -+ }) -+ -+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ -+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ -+ unsigned long long int __addr; \ -+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* %R3 = guest_NRADDR */ \ -+ "or 2,2,2\n\t" \ -+ "mr %0,3" \ -+ : "=b" (__addr) \ -+ : \ -+ : "cc", "memory", "r3" \ -+ ); \ -+ _zzq_orig->nraddr = __addr; \ -+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* %R3 = guest_NRADDR_GPR2 */ \ -+ "or 4,4,4\n\t" \ -+ "mr %0,3" \ -+ : "=b" (__addr) \ -+ : \ -+ : "cc", "memory", "r3" \ -+ ); \ -+ _zzq_orig->r2 = __addr; \ -+ } -+ -+#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ __SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* branch-and-link-to-noredir *%R12 */ \ -+ "or 3,3,3\n\t" -+ -+#define VALGRIND_VEX_INJECT_IR() \ -+ do { \ -+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ -+ "or 5,5,5\n\t" \ -+ ); \ -+ } while (0) -+ -+#endif /* PLAT_ppc64le_linux */ - - /* ------------------------- arm-linux ------------------------- */ - -@@ -646,6 +748,74 @@ typedef - - #endif /* PLAT_arm_linux */ - -+/* ------------------------ arm64-linux ------------------------- */ -+ -+#if defined(PLAT_arm64_linux) -+ -+typedef -+ struct { -+ unsigned long long int nraddr; /* where's the code? */ -+ } -+ OrigFn; -+ -+#define __SPECIAL_INSTRUCTION_PREAMBLE \ -+ "ror x12, x12, #3 ; ror x12, x12, #13 \n\t" \ -+ "ror x12, x12, #51 ; ror x12, x12, #61 \n\t" -+ -+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ -+ _zzq_default, _zzq_request, \ -+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ -+ \ -+ __extension__ \ -+ ({volatile unsigned long long int _zzq_args[6]; \ -+ volatile unsigned long long int _zzq_result; \ -+ _zzq_args[0] = (unsigned long long int)(_zzq_request); \ -+ _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ -+ _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ -+ _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ -+ _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ -+ _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ -+ __asm__ volatile("mov x3, %1\n\t" /*default*/ \ -+ "mov x4, %2\n\t" /*ptr*/ \ -+ __SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* X3 = client_request ( X4 ) */ \ -+ "orr x10, x10, x10\n\t" \ -+ "mov %0, x3" /*result*/ \ -+ : "=r" (_zzq_result) \ -+ : "r" (_zzq_default), "r" (&_zzq_args[0]) \ -+ : "cc","memory", "x3", "x4"); \ -+ _zzq_result; \ -+ }) -+ -+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ -+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ -+ unsigned long long int __addr; \ -+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* X3 = guest_NRADDR */ \ -+ "orr x11, x11, x11\n\t" \ -+ "mov %0, x3" \ -+ : "=r" (__addr) \ -+ : \ -+ : "cc", "memory", "x3" \ -+ ); \ -+ _zzq_orig->nraddr = __addr; \ -+ } -+ -+#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ -+ __SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* branch-and-link-to-noredir X8 */ \ -+ "orr x12, x12, x12\n\t" -+ -+#define VALGRIND_VEX_INJECT_IR() \ -+ do { \ -+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ -+ "orr x9, x9, x9\n\t" \ -+ : : : "cc", "memory" \ -+ ); \ -+ } while (0) -+ -+#endif /* PLAT_arm64_linux */ -+ - /* ------------------------ s390x-linux ------------------------ */ - - #if defined(PLAT_s390x_linux) -@@ -763,7 +933,7 @@ typedef - "move %0, $11\n\t" /*result*/ \ - : "=r" (_zzq_result) \ - : "r" (_zzq_default), "r" (&_zzq_args[0]) \ -- : "cc","memory", "t3", "t4"); \ -+ : "$11", "$12"); \ - _zzq_result; \ - }) - -@@ -776,7 +946,7 @@ typedef - "move %0, $11" /*result*/ \ - : "=r" (__addr) \ - : \ -- : "cc", "memory" , "t3" \ -+ : "$11" \ - ); \ - _zzq_orig->nraddr = __addr; \ - } -@@ -796,6 +966,75 @@ typedef - - #endif /* PLAT_mips32_linux */ - -+/* ------------------------- mips64-linux ---------------- */ -+ -+#if defined(PLAT_mips64_linux) -+ -+typedef -+ struct { -+ unsigned long long nraddr; /* where's the code? */ -+ } -+ OrigFn; -+ -+/* dsll $0,$0, 3 -+ * dsll $0,$0, 13 -+ * dsll $0,$0, 29 -+ * dsll $0,$0, 19*/ -+#define __SPECIAL_INSTRUCTION_PREAMBLE \ -+ "dsll $0,$0, 3 ; dsll $0,$0,13\n\t" \ -+ "dsll $0,$0,29 ; dsll $0,$0,19\n\t" -+ -+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ -+ _zzq_default, _zzq_request, \ -+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ -+ __extension__ \ -+ ({ volatile unsigned long long int _zzq_args[6]; \ -+ volatile unsigned long long int _zzq_result; \ -+ _zzq_args[0] = (unsigned long long int)(_zzq_request); \ -+ _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ -+ _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ -+ _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ -+ _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ -+ _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ -+ __asm__ volatile("move $11, %1\n\t" /*default*/ \ -+ "move $12, %2\n\t" /*ptr*/ \ -+ __SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* $11 = client_request ( $12 ) */ \ -+ "or $13, $13, $13\n\t" \ -+ "move %0, $11\n\t" /*result*/ \ -+ : "=r" (_zzq_result) \ -+ : "r" (_zzq_default), "r" (&_zzq_args[0]) \ -+ : "$11", "$12"); \ -+ _zzq_result; \ -+ }) -+ -+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ -+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ -+ volatile unsigned long long int __addr; \ -+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* $11 = guest_NRADDR */ \ -+ "or $14, $14, $14\n\t" \ -+ "move %0, $11" /*result*/ \ -+ : "=r" (__addr) \ -+ : \ -+ : "$11"); \ -+ _zzq_orig->nraddr = __addr; \ -+ } -+ -+#define VALGRIND_CALL_NOREDIR_T9 \ -+ __SPECIAL_INSTRUCTION_PREAMBLE \ -+ /* call-noredir $25 */ \ -+ "or $15, $15, $15\n\t" -+ -+#define VALGRIND_VEX_INJECT_IR() \ -+ do { \ -+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ -+ "or $11, $11, $11\n\t" \ -+ ); \ -+ } while (0) -+ -+#endif /* PLAT_mips64_linux */ -+ - /* Insert assembly code for other platforms here... */ - - #endif /* NVALGRIND */ -@@ -2379,7 +2618,7 @@ typedef - - /* ------------------------ ppc64-linux ------------------------ */ - --#if defined(PLAT_ppc64_linux) -+#if defined(PLAT_ppc64be_linux) - - /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ - -@@ -2932,54 +3171,56 @@ typedef - lval = (__typeof__(lval)) _res; \ - } while (0) - --#endif /* PLAT_ppc64_linux */ -+#endif /* PLAT_ppc64be_linux */ - --/* ------------------------- arm-linux ------------------------- */ -+/* ------------------------- ppc64le-linux ----------------------- */ -+#if defined(PLAT_ppc64le_linux) - --#if defined(PLAT_arm_linux) -+/* 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 "r0", "r1", "r2", "r3","r4","r14" -+#define __CALLER_SAVED_REGS \ -+ "lr", "ctr", "xer", \ -+ "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ -+ "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ -+ "r11", "r12", "r13" - - /* Macros to save and align the stack before making a function - call and restore it afterwards as gcc may not keep the stack - pointer aligned if it doesn't realise calls are being made - to other functions. */ - --/* This is a bit tricky. We store the original stack pointer in r10 -- as it is callee-saves. gcc doesn't allow the use of r11 for some -- reason. Also, we can't directly "bic" the stack pointer in thumb -- mode since r13 isn't an allowed register number in that context. -- So use r4 as a temporary, since that is about to get trashed -- anyway, just after each use of this macro. Side effect is we need -- to be very careful about any future changes, since -- VALGRIND_ALIGN_STACK simply assumes r4 is usable. */ - #define VALGRIND_ALIGN_STACK \ -- "mov r10, sp\n\t" \ -- "mov r4, sp\n\t" \ -- "bic r4, r4, #7\n\t" \ -- "mov sp, r4\n\t" -+ "mr 28,1\n\t" \ -+ "rldicr 1,1,0,59\n\t" - #define VALGRIND_RESTORE_STACK \ -- "mov sp, r10\n\t" -+ "mr 1,28\n\t" - --/* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned -- long) == 4. */ -+/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned -+ long) == 8. */ - - #define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ -- volatile unsigned long _argvec[1]; \ -+ volatile unsigned long _argvec[3+0]; \ - volatile unsigned long _res; \ -- _argvec[0] = (unsigned long)_orig.nraddr; \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -2987,20 +3228,27 @@ typedef - #define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ -- volatile unsigned long _argvec[2]; \ -+ volatile unsigned long _argvec[3+1]; \ - volatile unsigned long _res; \ -- _argvec[0] = (unsigned long)_orig.nraddr; \ -- _argvec[1] = (unsigned long)(arg1); \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3008,22 +3256,29 @@ typedef - #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ -- volatile unsigned long _argvec[3]; \ -+ volatile unsigned long _argvec[3+2]; \ - volatile unsigned long _res; \ -- _argvec[0] = (unsigned long)_orig.nraddr; \ -- _argvec[1] = (unsigned long)(arg1); \ -- _argvec[2] = (unsigned long)(arg2); \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3031,24 +3286,31 @@ typedef - #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ -- volatile unsigned long _argvec[4]; \ -+ volatile unsigned long _argvec[3+3]; \ - volatile unsigned long _res; \ -- _argvec[0] = (unsigned long)_orig.nraddr; \ -- _argvec[1] = (unsigned long)(arg1); \ -- _argvec[2] = (unsigned long)(arg2); \ -- _argvec[3] = (unsigned long)(arg3); \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r2, [%1, #12] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3056,15 +3318,647 @@ typedef - #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ -- volatile unsigned long _argvec[5]; \ -+ volatile unsigned long _argvec[3+4]; \ - volatile unsigned long _res; \ -- _argvec[0] = (unsigned long)_orig.nraddr; \ -- _argvec[1] = (unsigned long)(arg1); \ -- _argvec[2] = (unsigned long)(arg2); \ -- _argvec[3] = (unsigned long)(arg3); \ -- _argvec[4] = (unsigned long)(arg4); \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ -+ _argvec[2+4] = (unsigned long)arg4; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 6, 32(12)\n\t" /* arg4->r6 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ -+ VALGRIND_RESTORE_STACK \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[3+5]; \ -+ volatile unsigned long _res; \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ -+ _argvec[2+4] = (unsigned long)arg4; \ -+ _argvec[2+5] = (unsigned long)arg5; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 6, 32(12)\n\t" /* arg4->r6 */ \ -+ "ld 7, 40(12)\n\t" /* arg5->r7 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ -+ VALGRIND_RESTORE_STACK \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[3+6]; \ -+ volatile unsigned long _res; \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ -+ _argvec[2+4] = (unsigned long)arg4; \ -+ _argvec[2+5] = (unsigned long)arg5; \ -+ _argvec[2+6] = (unsigned long)arg6; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 6, 32(12)\n\t" /* arg4->r6 */ \ -+ "ld 7, 40(12)\n\t" /* arg5->r7 */ \ -+ "ld 8, 48(12)\n\t" /* arg6->r8 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ -+ VALGRIND_RESTORE_STACK \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ -+ arg7) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[3+7]; \ -+ volatile unsigned long _res; \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ -+ _argvec[2+4] = (unsigned long)arg4; \ -+ _argvec[2+5] = (unsigned long)arg5; \ -+ _argvec[2+6] = (unsigned long)arg6; \ -+ _argvec[2+7] = (unsigned long)arg7; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 6, 32(12)\n\t" /* arg4->r6 */ \ -+ "ld 7, 40(12)\n\t" /* arg5->r7 */ \ -+ "ld 8, 48(12)\n\t" /* arg6->r8 */ \ -+ "ld 9, 56(12)\n\t" /* arg7->r9 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ -+ VALGRIND_RESTORE_STACK \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ -+ arg7,arg8) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[3+8]; \ -+ volatile unsigned long _res; \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ -+ _argvec[2+4] = (unsigned long)arg4; \ -+ _argvec[2+5] = (unsigned long)arg5; \ -+ _argvec[2+6] = (unsigned long)arg6; \ -+ _argvec[2+7] = (unsigned long)arg7; \ -+ _argvec[2+8] = (unsigned long)arg8; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 6, 32(12)\n\t" /* arg4->r6 */ \ -+ "ld 7, 40(12)\n\t" /* arg5->r7 */ \ -+ "ld 8, 48(12)\n\t" /* arg6->r8 */ \ -+ "ld 9, 56(12)\n\t" /* arg7->r9 */ \ -+ "ld 10, 64(12)\n\t" /* arg8->r10 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ -+ VALGRIND_RESTORE_STACK \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[3+9]; \ -+ volatile unsigned long _res; \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ -+ _argvec[2+4] = (unsigned long)arg4; \ -+ _argvec[2+5] = (unsigned long)arg5; \ -+ _argvec[2+6] = (unsigned long)arg6; \ -+ _argvec[2+7] = (unsigned long)arg7; \ -+ _argvec[2+8] = (unsigned long)arg8; \ -+ _argvec[2+9] = (unsigned long)arg9; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "addi 1,1,-128\n\t" /* expand stack frame */ \ -+ /* arg9 */ \ -+ "ld 3,72(12)\n\t" \ -+ "std 3,96(1)\n\t" \ -+ /* args1-8 */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 6, 32(12)\n\t" /* arg4->r6 */ \ -+ "ld 7, 40(12)\n\t" /* arg5->r7 */ \ -+ "ld 8, 48(12)\n\t" /* arg6->r8 */ \ -+ "ld 9, 56(12)\n\t" /* arg7->r9 */ \ -+ "ld 10, 64(12)\n\t" /* arg8->r10 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ -+ VALGRIND_RESTORE_STACK \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[3+10]; \ -+ volatile unsigned long _res; \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ -+ _argvec[2+4] = (unsigned long)arg4; \ -+ _argvec[2+5] = (unsigned long)arg5; \ -+ _argvec[2+6] = (unsigned long)arg6; \ -+ _argvec[2+7] = (unsigned long)arg7; \ -+ _argvec[2+8] = (unsigned long)arg8; \ -+ _argvec[2+9] = (unsigned long)arg9; \ -+ _argvec[2+10] = (unsigned long)arg10; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "addi 1,1,-128\n\t" /* expand stack frame */ \ -+ /* arg10 */ \ -+ "ld 3,80(12)\n\t" \ -+ "std 3,104(1)\n\t" \ -+ /* arg9 */ \ -+ "ld 3,72(12)\n\t" \ -+ "std 3,96(1)\n\t" \ -+ /* args1-8 */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 6, 32(12)\n\t" /* arg4->r6 */ \ -+ "ld 7, 40(12)\n\t" /* arg5->r7 */ \ -+ "ld 8, 48(12)\n\t" /* arg6->r8 */ \ -+ "ld 9, 56(12)\n\t" /* arg7->r9 */ \ -+ "ld 10, 64(12)\n\t" /* arg8->r10 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ -+ VALGRIND_RESTORE_STACK \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[3+11]; \ -+ volatile unsigned long _res; \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ -+ _argvec[2+4] = (unsigned long)arg4; \ -+ _argvec[2+5] = (unsigned long)arg5; \ -+ _argvec[2+6] = (unsigned long)arg6; \ -+ _argvec[2+7] = (unsigned long)arg7; \ -+ _argvec[2+8] = (unsigned long)arg8; \ -+ _argvec[2+9] = (unsigned long)arg9; \ -+ _argvec[2+10] = (unsigned long)arg10; \ -+ _argvec[2+11] = (unsigned long)arg11; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "addi 1,1,-144\n\t" /* expand stack frame */ \ -+ /* arg11 */ \ -+ "ld 3,88(12)\n\t" \ -+ "std 3,112(1)\n\t" \ -+ /* arg10 */ \ -+ "ld 3,80(12)\n\t" \ -+ "std 3,104(1)\n\t" \ -+ /* arg9 */ \ -+ "ld 3,72(12)\n\t" \ -+ "std 3,96(1)\n\t" \ -+ /* args1-8 */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 6, 32(12)\n\t" /* arg4->r6 */ \ -+ "ld 7, 40(12)\n\t" /* arg5->r7 */ \ -+ "ld 8, 48(12)\n\t" /* arg6->r8 */ \ -+ "ld 9, 56(12)\n\t" /* arg7->r9 */ \ -+ "ld 10, 64(12)\n\t" /* arg8->r10 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ -+ VALGRIND_RESTORE_STACK \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[3+12]; \ -+ volatile unsigned long _res; \ -+ /* _argvec[0] holds current r2 across the call */ \ -+ _argvec[1] = (unsigned long)_orig.r2; \ -+ _argvec[2] = (unsigned long)_orig.nraddr; \ -+ _argvec[2+1] = (unsigned long)arg1; \ -+ _argvec[2+2] = (unsigned long)arg2; \ -+ _argvec[2+3] = (unsigned long)arg3; \ -+ _argvec[2+4] = (unsigned long)arg4; \ -+ _argvec[2+5] = (unsigned long)arg5; \ -+ _argvec[2+6] = (unsigned long)arg6; \ -+ _argvec[2+7] = (unsigned long)arg7; \ -+ _argvec[2+8] = (unsigned long)arg8; \ -+ _argvec[2+9] = (unsigned long)arg9; \ -+ _argvec[2+10] = (unsigned long)arg10; \ -+ _argvec[2+11] = (unsigned long)arg11; \ -+ _argvec[2+12] = (unsigned long)arg12; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "mr 12,%1\n\t" \ -+ "std 2,-16(12)\n\t" /* save tocptr */ \ -+ "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ -+ "addi 1,1,-144\n\t" /* expand stack frame */ \ -+ /* arg12 */ \ -+ "ld 3,96(12)\n\t" \ -+ "std 3,120(1)\n\t" \ -+ /* arg11 */ \ -+ "ld 3,88(12)\n\t" \ -+ "std 3,112(1)\n\t" \ -+ /* arg10 */ \ -+ "ld 3,80(12)\n\t" \ -+ "std 3,104(1)\n\t" \ -+ /* arg9 */ \ -+ "ld 3,72(12)\n\t" \ -+ "std 3,96(1)\n\t" \ -+ /* args1-8 */ \ -+ "ld 3, 8(12)\n\t" /* arg1->r3 */ \ -+ "ld 4, 16(12)\n\t" /* arg2->r4 */ \ -+ "ld 5, 24(12)\n\t" /* arg3->r5 */ \ -+ "ld 6, 32(12)\n\t" /* arg4->r6 */ \ -+ "ld 7, 40(12)\n\t" /* arg5->r7 */ \ -+ "ld 8, 48(12)\n\t" /* arg6->r8 */ \ -+ "ld 9, 56(12)\n\t" /* arg7->r9 */ \ -+ "ld 10, 64(12)\n\t" /* arg8->r10 */ \ -+ "ld 12, 0(12)\n\t" /* target->r12 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ -+ "mr 12,%1\n\t" \ -+ "mr %0,3\n\t" \ -+ "ld 2,-16(12)\n\t" /* restore tocptr */ \ -+ VALGRIND_RESTORE_STACK \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[2]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#endif /* PLAT_ppc64le_linux */ -+ -+/* ------------------------- arm-linux ------------------------- */ -+ -+#if defined(PLAT_arm_linux) -+ -+/* These regs are trashed by the hidden call. */ -+#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14" -+ -+/* Macros to save and align the stack before making a function -+ call and restore it afterwards as gcc may not keep the stack -+ pointer aligned if it doesn't realise calls are being made -+ to other functions. */ -+ -+/* This is a bit tricky. We store the original stack pointer in r10 -+ as it is callee-saves. gcc doesn't allow the use of r11 for some -+ reason. Also, we can't directly "bic" the stack pointer in thumb -+ mode since r13 isn't an allowed register number in that context. -+ So use r4 as a temporary, since that is about to get trashed -+ anyway, just after each use of this macro. Side effect is we need -+ to be very careful about any future changes, since -+ VALGRIND_ALIGN_STACK simply assumes r4 is usable. */ -+#define VALGRIND_ALIGN_STACK \ -+ "mov r10, sp\n\t" \ -+ "mov r4, sp\n\t" \ -+ "bic r4, r4, #7\n\t" \ -+ "mov sp, r4\n\t" -+#define VALGRIND_RESTORE_STACK \ -+ "mov sp, r10\n\t" -+ -+/* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned -+ long) == 4. */ -+ -+#define CALL_FN_W_v(lval, orig) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[1]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_W(lval, orig, arg1) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[2]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[3]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[4]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r2, [%1, #12] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[5]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r2, [%1, #12] \n\t" \ -+ "ldr r3, [%1, #16] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[6]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "sub sp, sp, #4 \n\t" \ -+ "ldr r0, [%1, #20] \n\t" \ -+ "push {r0} \n\t" \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r2, [%1, #12] \n\t" \ -+ "ldr r3, [%1, #16] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[7]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr r0, [%1, #20] \n\t" \ -+ "ldr r1, [%1, #24] \n\t" \ -+ "push {r0, r1} \n\t" \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r2, [%1, #12] \n\t" \ -+ "ldr r3, [%1, #16] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ -+ arg7) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[8]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "sub sp, sp, #4 \n\t" \ -+ "ldr r0, [%1, #20] \n\t" \ -+ "ldr r1, [%1, #24] \n\t" \ -+ "ldr r2, [%1, #28] \n\t" \ -+ "push {r0, r1, r2} \n\t" \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ -@@ -3072,10 +3966,364 @@ typedef - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0" \ -+ "mov %0, r0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ -+ arg7,arg8) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[9]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr r0, [%1, #20] \n\t" \ -+ "ldr r1, [%1, #24] \n\t" \ -+ "ldr r2, [%1, #28] \n\t" \ -+ "ldr r3, [%1, #32] \n\t" \ -+ "push {r0, r1, r2, r3} \n\t" \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r2, [%1, #12] \n\t" \ -+ "ldr r3, [%1, #16] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[10]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ _argvec[9] = (unsigned long)(arg9); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "sub sp, sp, #4 \n\t" \ -+ "ldr r0, [%1, #20] \n\t" \ -+ "ldr r1, [%1, #24] \n\t" \ -+ "ldr r2, [%1, #28] \n\t" \ -+ "ldr r3, [%1, #32] \n\t" \ -+ "ldr r4, [%1, #36] \n\t" \ -+ "push {r0, r1, r2, r3, r4} \n\t" \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r2, [%1, #12] \n\t" \ -+ "ldr r3, [%1, #16] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[11]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ _argvec[9] = (unsigned long)(arg9); \ -+ _argvec[10] = (unsigned long)(arg10); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr r0, [%1, #40] \n\t" \ -+ "push {r0} \n\t" \ -+ "ldr r0, [%1, #20] \n\t" \ -+ "ldr r1, [%1, #24] \n\t" \ -+ "ldr r2, [%1, #28] \n\t" \ -+ "ldr r3, [%1, #32] \n\t" \ -+ "ldr r4, [%1, #36] \n\t" \ -+ "push {r0, r1, r2, r3, r4} \n\t" \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r2, [%1, #12] \n\t" \ -+ "ldr r3, [%1, #16] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[12]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ _argvec[9] = (unsigned long)(arg9); \ -+ _argvec[10] = (unsigned long)(arg10); \ -+ _argvec[11] = (unsigned long)(arg11); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "sub sp, sp, #4 \n\t" \ -+ "ldr r0, [%1, #40] \n\t" \ -+ "ldr r1, [%1, #44] \n\t" \ -+ "push {r0, r1} \n\t" \ -+ "ldr r0, [%1, #20] \n\t" \ -+ "ldr r1, [%1, #24] \n\t" \ -+ "ldr r2, [%1, #28] \n\t" \ -+ "ldr r3, [%1, #32] \n\t" \ -+ "ldr r4, [%1, #36] \n\t" \ -+ "push {r0, r1, r2, r3, r4} \n\t" \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r2, [%1, #12] \n\t" \ -+ "ldr r3, [%1, #16] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[13]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ _argvec[9] = (unsigned long)(arg9); \ -+ _argvec[10] = (unsigned long)(arg10); \ -+ _argvec[11] = (unsigned long)(arg11); \ -+ _argvec[12] = (unsigned long)(arg12); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr r0, [%1, #40] \n\t" \ -+ "ldr r1, [%1, #44] \n\t" \ -+ "ldr r2, [%1, #48] \n\t" \ -+ "push {r0, r1, r2} \n\t" \ -+ "ldr r0, [%1, #20] \n\t" \ -+ "ldr r1, [%1, #24] \n\t" \ -+ "ldr r2, [%1, #28] \n\t" \ -+ "ldr r3, [%1, #32] \n\t" \ -+ "ldr r4, [%1, #36] \n\t" \ -+ "push {r0, r1, r2, r3, r4} \n\t" \ -+ "ldr r0, [%1, #4] \n\t" \ -+ "ldr r1, [%1, #8] \n\t" \ -+ "ldr r2, [%1, #12] \n\t" \ -+ "ldr r3, [%1, #16] \n\t" \ -+ "ldr r4, [%1] \n\t" /* target->r4 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, r0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#endif /* PLAT_arm_linux */ -+ -+/* ------------------------ arm64-linux ------------------------ */ -+ -+#if defined(PLAT_arm64_linux) -+ -+/* These regs are trashed by the hidden call. */ -+#define __CALLER_SAVED_REGS \ -+ "x0", "x1", "x2", "x3","x4", "x5", "x6", "x7", "x8", "x9", \ -+ "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", \ -+ "x18", "x19", "x20", "x30", \ -+ "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", \ -+ "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", \ -+ "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", \ -+ "v26", "v27", "v28", "v29", "v30", "v31" -+ -+/* x21 is callee-saved, so we can use it to save and restore SP around -+ the hidden call. */ -+#define VALGRIND_ALIGN_STACK \ -+ "mov x21, sp\n\t" \ -+ "bic sp, x21, #15\n\t" -+#define VALGRIND_RESTORE_STACK \ -+ "mov sp, x21\n\t" -+ -+/* These CALL_FN_ macros assume that on arm64-linux, -+ sizeof(unsigned long) == 8. */ -+ -+#define CALL_FN_W_v(lval, orig) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[1]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, x0\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_W(lval, orig, arg1) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[2]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, x0\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[3]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, x0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[4]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, x0\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[5]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ __asm__ volatile( \ -+ VALGRIND_ALIGN_STACK \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x3, [%1, #32] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ -+ VALGRIND_RESTORE_STACK \ -+ "mov %0, x0" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3093,20 +4341,18 @@ typedef - _argvec[5] = (unsigned long)(arg5); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "sub sp, sp, #4 \n\t" \ -- "ldr r0, [%1, #20] \n\t" \ -- "push {r0} \n\t" \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r2, [%1, #12] \n\t" \ -- "ldr r3, [%1, #16] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x3, [%1, #32] \n\t" \ -+ "ldr x4, [%1, #40] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0" \ -+ "mov %0, x0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3125,20 +4371,19 @@ typedef - _argvec[6] = (unsigned long)(arg6); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "ldr r0, [%1, #20] \n\t" \ -- "ldr r1, [%1, #24] \n\t" \ -- "push {r0, r1} \n\t" \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r2, [%1, #12] \n\t" \ -- "ldr r3, [%1, #16] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x3, [%1, #32] \n\t" \ -+ "ldr x4, [%1, #40] \n\t" \ -+ "ldr x5, [%1, #48] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0" \ -+ "mov %0, x0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3159,22 +4404,20 @@ typedef - _argvec[7] = (unsigned long)(arg7); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "sub sp, sp, #4 \n\t" \ -- "ldr r0, [%1, #20] \n\t" \ -- "ldr r1, [%1, #24] \n\t" \ -- "ldr r2, [%1, #28] \n\t" \ -- "push {r0, r1, r2} \n\t" \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r2, [%1, #12] \n\t" \ -- "ldr r3, [%1, #16] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x3, [%1, #32] \n\t" \ -+ "ldr x4, [%1, #40] \n\t" \ -+ "ldr x5, [%1, #48] \n\t" \ -+ "ldr x6, [%1, #56] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0" \ -+ "mov %0, x0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3196,22 +4439,21 @@ typedef - _argvec[8] = (unsigned long)(arg8); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "ldr r0, [%1, #20] \n\t" \ -- "ldr r1, [%1, #24] \n\t" \ -- "ldr r2, [%1, #28] \n\t" \ -- "ldr r3, [%1, #32] \n\t" \ -- "push {r0, r1, r2, r3} \n\t" \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r2, [%1, #12] \n\t" \ -- "ldr r3, [%1, #16] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x3, [%1, #32] \n\t" \ -+ "ldr x4, [%1, #40] \n\t" \ -+ "ldr x5, [%1, #48] \n\t" \ -+ "ldr x6, [%1, #56] \n\t" \ -+ "ldr x7, [%1, #64] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0" \ -+ "mov %0, x0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3234,24 +4476,24 @@ typedef - _argvec[9] = (unsigned long)(arg9); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "sub sp, sp, #4 \n\t" \ -- "ldr r0, [%1, #20] \n\t" \ -- "ldr r1, [%1, #24] \n\t" \ -- "ldr r2, [%1, #28] \n\t" \ -- "ldr r3, [%1, #32] \n\t" \ -- "ldr r4, [%1, #36] \n\t" \ -- "push {r0, r1, r2, r3, r4} \n\t" \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r2, [%1, #12] \n\t" \ -- "ldr r3, [%1, #16] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "sub sp, sp, #0x20 \n\t" \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x3, [%1, #32] \n\t" \ -+ "ldr x4, [%1, #40] \n\t" \ -+ "ldr x5, [%1, #48] \n\t" \ -+ "ldr x6, [%1, #56] \n\t" \ -+ "ldr x7, [%1, #64] \n\t" \ -+ "ldr x8, [%1, #72] \n\t" \ -+ "str x8, [sp, #0] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0" \ -+ "mov %0, x0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3275,32 +4517,32 @@ typedef - _argvec[10] = (unsigned long)(arg10); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "ldr r0, [%1, #40] \n\t" \ -- "push {r0} \n\t" \ -- "ldr r0, [%1, #20] \n\t" \ -- "ldr r1, [%1, #24] \n\t" \ -- "ldr r2, [%1, #28] \n\t" \ -- "ldr r3, [%1, #32] \n\t" \ -- "ldr r4, [%1, #36] \n\t" \ -- "push {r0, r1, r2, r3, r4} \n\t" \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r2, [%1, #12] \n\t" \ -- "ldr r3, [%1, #16] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "sub sp, sp, #0x20 \n\t" \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x3, [%1, #32] \n\t" \ -+ "ldr x4, [%1, #40] \n\t" \ -+ "ldr x5, [%1, #48] \n\t" \ -+ "ldr x6, [%1, #56] \n\t" \ -+ "ldr x7, [%1, #64] \n\t" \ -+ "ldr x8, [%1, #72] \n\t" \ -+ "str x8, [sp, #0] \n\t" \ -+ "ldr x8, [%1, #80] \n\t" \ -+ "str x8, [sp, #8] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0" \ -+ "mov %0, x0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - --#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ -- arg6,arg7,arg8,arg9,arg10, \ -- arg11) \ -+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ -+ arg7,arg8,arg9,arg10,arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ -@@ -3319,34 +4561,35 @@ typedef - _argvec[11] = (unsigned long)(arg11); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "sub sp, sp, #4 \n\t" \ -- "ldr r0, [%1, #40] \n\t" \ -- "ldr r1, [%1, #44] \n\t" \ -- "push {r0, r1} \n\t" \ -- "ldr r0, [%1, #20] \n\t" \ -- "ldr r1, [%1, #24] \n\t" \ -- "ldr r2, [%1, #28] \n\t" \ -- "ldr r3, [%1, #32] \n\t" \ -- "ldr r4, [%1, #36] \n\t" \ -- "push {r0, r1, r2, r3, r4} \n\t" \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r2, [%1, #12] \n\t" \ -- "ldr r3, [%1, #16] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "sub sp, sp, #0x30 \n\t" \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x3, [%1, #32] \n\t" \ -+ "ldr x4, [%1, #40] \n\t" \ -+ "ldr x5, [%1, #48] \n\t" \ -+ "ldr x6, [%1, #56] \n\t" \ -+ "ldr x7, [%1, #64] \n\t" \ -+ "ldr x8, [%1, #72] \n\t" \ -+ "str x8, [sp, #0] \n\t" \ -+ "ldr x8, [%1, #80] \n\t" \ -+ "str x8, [sp, #8] \n\t" \ -+ "ldr x8, [%1, #88] \n\t" \ -+ "str x8, [sp, #16] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0" \ -+ "mov %0, x0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - --#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ -- arg6,arg7,arg8,arg9,arg10, \ -- arg11,arg12) \ -+#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ -+ arg7,arg8,arg9,arg10,arg11, \ -+ arg12) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ -@@ -3366,32 +4609,35 @@ typedef - _argvec[12] = (unsigned long)(arg12); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ -- "ldr r0, [%1, #40] \n\t" \ -- "ldr r1, [%1, #44] \n\t" \ -- "ldr r2, [%1, #48] \n\t" \ -- "push {r0, r1, r2} \n\t" \ -- "ldr r0, [%1, #20] \n\t" \ -- "ldr r1, [%1, #24] \n\t" \ -- "ldr r2, [%1, #28] \n\t" \ -- "ldr r3, [%1, #32] \n\t" \ -- "ldr r4, [%1, #36] \n\t" \ -- "push {r0, r1, r2, r3, r4} \n\t" \ -- "ldr r0, [%1, #4] \n\t" \ -- "ldr r1, [%1, #8] \n\t" \ -- "ldr r2, [%1, #12] \n\t" \ -- "ldr r3, [%1, #16] \n\t" \ -- "ldr r4, [%1] \n\t" /* target->r4 */ \ -- VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ -+ "sub sp, sp, #0x30 \n\t" \ -+ "ldr x0, [%1, #8] \n\t" \ -+ "ldr x1, [%1, #16] \n\t" \ -+ "ldr x2, [%1, #24] \n\t" \ -+ "ldr x3, [%1, #32] \n\t" \ -+ "ldr x4, [%1, #40] \n\t" \ -+ "ldr x5, [%1, #48] \n\t" \ -+ "ldr x6, [%1, #56] \n\t" \ -+ "ldr x7, [%1, #64] \n\t" \ -+ "ldr x8, [%1, #72] \n\t" \ -+ "str x8, [sp, #0] \n\t" \ -+ "ldr x8, [%1, #80] \n\t" \ -+ "str x8, [sp, #8] \n\t" \ -+ "ldr x8, [%1, #88] \n\t" \ -+ "str x8, [sp, #16] \n\t" \ -+ "ldr x8, [%1, #96] \n\t" \ -+ "str x8, [sp, #24] \n\t" \ -+ "ldr x8, [%1] \n\t" /* target->x8 */ \ -+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ - VALGRIND_RESTORE_STACK \ -- "mov %0, r0" \ -+ "mov %0, x0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - --#endif /* PLAT_arm_linux */ -+#endif /* PLAT_arm64_linux */ - - /* ------------------------- s390x-linux ------------------------- */ - -@@ -3659,7 +4905,85 @@ typedef - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ -- "aghi 15,176\n\t" \ -+ "aghi 15,176\n\t" \ -+ VALGRIND_CFI_EPILOGUE \ -+ : /*out*/ "=d" (_res) \ -+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ -+ arg6, arg7 ,arg8) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[9]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)arg1; \ -+ _argvec[2] = (unsigned long)arg2; \ -+ _argvec[3] = (unsigned long)arg3; \ -+ _argvec[4] = (unsigned long)arg4; \ -+ _argvec[5] = (unsigned long)arg5; \ -+ _argvec[6] = (unsigned long)arg6; \ -+ _argvec[7] = (unsigned long)arg7; \ -+ _argvec[8] = (unsigned long)arg8; \ -+ __asm__ volatile( \ -+ VALGRIND_CFI_PROLOGUE \ -+ "aghi 15,-184\n\t" \ -+ "lg 2, 8(1)\n\t" \ -+ "lg 3,16(1)\n\t" \ -+ "lg 4,24(1)\n\t" \ -+ "lg 5,32(1)\n\t" \ -+ "lg 6,40(1)\n\t" \ -+ "mvc 160(8,15), 48(1)\n\t" \ -+ "mvc 168(8,15), 56(1)\n\t" \ -+ "mvc 176(8,15), 64(1)\n\t" \ -+ "lg 1, 0(1)\n\t" \ -+ VALGRIND_CALL_NOREDIR_R1 \ -+ "lgr %0, 2\n\t" \ -+ "aghi 15,184\n\t" \ -+ VALGRIND_CFI_EPILOGUE \ -+ : /*out*/ "=d" (_res) \ -+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ -+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[10]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)arg1; \ -+ _argvec[2] = (unsigned long)arg2; \ -+ _argvec[3] = (unsigned long)arg3; \ -+ _argvec[4] = (unsigned long)arg4; \ -+ _argvec[5] = (unsigned long)arg5; \ -+ _argvec[6] = (unsigned long)arg6; \ -+ _argvec[7] = (unsigned long)arg7; \ -+ _argvec[8] = (unsigned long)arg8; \ -+ _argvec[9] = (unsigned long)arg9; \ -+ __asm__ volatile( \ -+ VALGRIND_CFI_PROLOGUE \ -+ "aghi 15,-192\n\t" \ -+ "lg 2, 8(1)\n\t" \ -+ "lg 3,16(1)\n\t" \ -+ "lg 4,24(1)\n\t" \ -+ "lg 5,32(1)\n\t" \ -+ "lg 6,40(1)\n\t" \ -+ "mvc 160(8,15), 48(1)\n\t" \ -+ "mvc 168(8,15), 56(1)\n\t" \ -+ "mvc 176(8,15), 64(1)\n\t" \ -+ "mvc 184(8,15), 72(1)\n\t" \ -+ "lg 1, 0(1)\n\t" \ -+ VALGRIND_CALL_NOREDIR_R1 \ -+ "lgr %0, 2\n\t" \ -+ "aghi 15,192\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ -@@ -3668,11 +4992,11 @@ typedef - lval = (__typeof__(lval)) _res; \ - } while (0) - --#define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ -- arg6, arg7 ,arg8) \ -+#define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ -+ arg6, arg7 ,arg8, arg9, arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ -- volatile unsigned long _argvec[9]; \ -+ volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ -@@ -3683,9 +5007,11 @@ typedef - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ -+ _argvec[9] = (unsigned long)arg9; \ -+ _argvec[10] = (unsigned long)arg10; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ -- "aghi 15,-184\n\t" \ -+ "aghi 15,-200\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ -@@ -3694,10 +5020,12 @@ typedef - "mvc 160(8,15), 48(1)\n\t" \ - "mvc 168(8,15), 56(1)\n\t" \ - "mvc 176(8,15), 64(1)\n\t" \ -+ "mvc 184(8,15), 72(1)\n\t" \ -+ "mvc 192(8,15), 80(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ -- "aghi 15,184\n\t" \ -+ "aghi 15,200\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ -@@ -3706,11 +5034,11 @@ typedef - lval = (__typeof__(lval)) _res; \ - } while (0) - --#define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ -- arg6, arg7 ,arg8, arg9) \ -+#define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ -+ arg6, arg7 ,arg8, arg9, arg10, arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ -- volatile unsigned long _argvec[10]; \ -+ volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ -@@ -3722,9 +5050,11 @@ typedef - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ -+ _argvec[10] = (unsigned long)arg10; \ -+ _argvec[11] = (unsigned long)arg11; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ -- "aghi 15,-192\n\t" \ -+ "aghi 15,-208\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ -@@ -3734,10 +5064,12 @@ typedef - "mvc 168(8,15), 56(1)\n\t" \ - "mvc 176(8,15), 64(1)\n\t" \ - "mvc 184(8,15), 72(1)\n\t" \ -+ "mvc 192(8,15), 80(1)\n\t" \ -+ "mvc 200(8,15), 88(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ -- "aghi 15,192\n\t" \ -+ "aghi 15,208\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ -@@ -3746,11 +5078,11 @@ typedef - lval = (__typeof__(lval)) _res; \ - } while (0) - --#define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ -- arg6, arg7 ,arg8, arg9, arg10) \ -+#define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ -+ arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\ - do { \ - volatile OrigFn _orig = (orig); \ -- volatile unsigned long _argvec[11]; \ -+ volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ -@@ -3763,9 +5095,11 @@ typedef - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ - _argvec[10] = (unsigned long)arg10; \ -+ _argvec[11] = (unsigned long)arg11; \ -+ _argvec[12] = (unsigned long)arg12; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ -- "aghi 15,-200\n\t" \ -+ "aghi 15,-216\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ -@@ -3776,10 +5110,12 @@ typedef - "mvc 176(8,15), 64(1)\n\t" \ - "mvc 184(8,15), 72(1)\n\t" \ - "mvc 192(8,15), 80(1)\n\t" \ -+ "mvc 200(8,15), 88(1)\n\t" \ -+ "mvc 208(8,15), 96(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ -- "aghi 15,200\n\t" \ -+ "aghi 15,216\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ -@@ -3788,102 +5124,551 @@ typedef - lval = (__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 = (orig); \ -- volatile unsigned long _argvec[12]; \ -- volatile unsigned long _res; \ -- _argvec[0] = (unsigned long)_orig.nraddr; \ -- _argvec[1] = (unsigned long)arg1; \ -- _argvec[2] = (unsigned long)arg2; \ -- _argvec[3] = (unsigned long)arg3; \ -- _argvec[4] = (unsigned long)arg4; \ -- _argvec[5] = (unsigned long)arg5; \ -- _argvec[6] = (unsigned long)arg6; \ -- _argvec[7] = (unsigned long)arg7; \ -- _argvec[8] = (unsigned long)arg8; \ -- _argvec[9] = (unsigned long)arg9; \ -- _argvec[10] = (unsigned long)arg10; \ -- _argvec[11] = (unsigned long)arg11; \ -- __asm__ volatile( \ -- VALGRIND_CFI_PROLOGUE \ -- "aghi 15,-208\n\t" \ -- "lg 2, 8(1)\n\t" \ -- "lg 3,16(1)\n\t" \ -- "lg 4,24(1)\n\t" \ -- "lg 5,32(1)\n\t" \ -- "lg 6,40(1)\n\t" \ -- "mvc 160(8,15), 48(1)\n\t" \ -- "mvc 168(8,15), 56(1)\n\t" \ -- "mvc 176(8,15), 64(1)\n\t" \ -- "mvc 184(8,15), 72(1)\n\t" \ -- "mvc 192(8,15), 80(1)\n\t" \ -- "mvc 200(8,15), 88(1)\n\t" \ -- "lg 1, 0(1)\n\t" \ -- VALGRIND_CALL_NOREDIR_R1 \ -- "lgr %0, 2\n\t" \ -- "aghi 15,208\n\t" \ -- VALGRIND_CFI_EPILOGUE \ -- : /*out*/ "=d" (_res) \ -- : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ -- ); \ -- lval = (__typeof__(lval)) _res; \ -+ -+#endif /* PLAT_s390x_linux */ -+ -+/* ------------------------- mips32-linux ----------------------- */ -+ -+#if defined(PLAT_mips32_linux) -+ -+/* These regs are trashed by the hidden call. */ -+#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \ -+"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \ -+"$25", "$31" -+ -+/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned -+ long) == 4. */ -+ -+#define CALL_FN_W_v(lval, orig) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[1]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "subu $29, $29, 16 \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 16\n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_W(lval, orig, arg1) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[2]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "subu $29, $29, 16 \n\t" \ -+ "lw $4, 4(%1) \n\t" /* arg1*/ \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 16 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[3]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "subu $29, $29, 16 \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 16 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[4]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "subu $29, $29, 16 \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 16 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[5]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "subu $29, $29, 16 \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $7, 16(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 16 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[6]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "lw $4, 20(%1) \n\t" \ -+ "subu $29, $29, 24\n\t" \ -+ "sw $4, 16($29) \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $7, 16(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 24 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[7]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "lw $4, 20(%1) \n\t" \ -+ "subu $29, $29, 32\n\t" \ -+ "sw $4, 16($29) \n\t" \ -+ "lw $4, 24(%1) \n\t" \ -+ "nop\n\t" \ -+ "sw $4, 20($29) \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $7, 16(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 32 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ -+ arg7) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[8]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "lw $4, 20(%1) \n\t" \ -+ "subu $29, $29, 32\n\t" \ -+ "sw $4, 16($29) \n\t" \ -+ "lw $4, 24(%1) \n\t" \ -+ "sw $4, 20($29) \n\t" \ -+ "lw $4, 28(%1) \n\t" \ -+ "sw $4, 24($29) \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $7, 16(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 32 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) -+ -+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ -+ arg7,arg8) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[9]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "lw $4, 20(%1) \n\t" \ -+ "subu $29, $29, 40\n\t" \ -+ "sw $4, 16($29) \n\t" \ -+ "lw $4, 24(%1) \n\t" \ -+ "sw $4, 20($29) \n\t" \ -+ "lw $4, 28(%1) \n\t" \ -+ "sw $4, 24($29) \n\t" \ -+ "lw $4, 32(%1) \n\t" \ -+ "sw $4, 28($29) \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $7, 16(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 40 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[10]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ _argvec[9] = (unsigned long)(arg9); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "lw $4, 20(%1) \n\t" \ -+ "subu $29, $29, 40\n\t" \ -+ "sw $4, 16($29) \n\t" \ -+ "lw $4, 24(%1) \n\t" \ -+ "sw $4, 20($29) \n\t" \ -+ "lw $4, 28(%1) \n\t" \ -+ "sw $4, 24($29) \n\t" \ -+ "lw $4, 32(%1) \n\t" \ -+ "sw $4, 28($29) \n\t" \ -+ "lw $4, 36(%1) \n\t" \ -+ "sw $4, 32($29) \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $7, 16(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 40 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[11]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ _argvec[9] = (unsigned long)(arg9); \ -+ _argvec[10] = (unsigned long)(arg10); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "lw $4, 20(%1) \n\t" \ -+ "subu $29, $29, 48\n\t" \ -+ "sw $4, 16($29) \n\t" \ -+ "lw $4, 24(%1) \n\t" \ -+ "sw $4, 20($29) \n\t" \ -+ "lw $4, 28(%1) \n\t" \ -+ "sw $4, 24($29) \n\t" \ -+ "lw $4, 32(%1) \n\t" \ -+ "sw $4, 28($29) \n\t" \ -+ "lw $4, 36(%1) \n\t" \ -+ "sw $4, 32($29) \n\t" \ -+ "lw $4, 40(%1) \n\t" \ -+ "sw $4, 36($29) \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $7, 16(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 48 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__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 = (orig); \ -- volatile unsigned long _argvec[13]; \ -- volatile unsigned long _res; \ -- _argvec[0] = (unsigned long)_orig.nraddr; \ -- _argvec[1] = (unsigned long)arg1; \ -- _argvec[2] = (unsigned long)arg2; \ -- _argvec[3] = (unsigned long)arg3; \ -- _argvec[4] = (unsigned long)arg4; \ -- _argvec[5] = (unsigned long)arg5; \ -- _argvec[6] = (unsigned long)arg6; \ -- _argvec[7] = (unsigned long)arg7; \ -- _argvec[8] = (unsigned long)arg8; \ -- _argvec[9] = (unsigned long)arg9; \ -- _argvec[10] = (unsigned long)arg10; \ -- _argvec[11] = (unsigned long)arg11; \ -- _argvec[12] = (unsigned long)arg12; \ -- __asm__ volatile( \ -- VALGRIND_CFI_PROLOGUE \ -- "aghi 15,-216\n\t" \ -- "lg 2, 8(1)\n\t" \ -- "lg 3,16(1)\n\t" \ -- "lg 4,24(1)\n\t" \ -- "lg 5,32(1)\n\t" \ -- "lg 6,40(1)\n\t" \ -- "mvc 160(8,15), 48(1)\n\t" \ -- "mvc 168(8,15), 56(1)\n\t" \ -- "mvc 176(8,15), 64(1)\n\t" \ -- "mvc 184(8,15), 72(1)\n\t" \ -- "mvc 192(8,15), 80(1)\n\t" \ -- "mvc 200(8,15), 88(1)\n\t" \ -- "mvc 208(8,15), 96(1)\n\t" \ -- "lg 1, 0(1)\n\t" \ -- VALGRIND_CALL_NOREDIR_R1 \ -- "lgr %0, 2\n\t" \ -- "aghi 15,216\n\t" \ -- VALGRIND_CFI_EPILOGUE \ -- : /*out*/ "=d" (_res) \ -- : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ -- ); \ -- lval = (__typeof__(lval)) _res; \ -+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ -+ arg6,arg7,arg8,arg9,arg10, \ -+ arg11) \ -+ do { \ -+ volatile OrigFn _orig = (orig); \ -+ volatile unsigned long _argvec[12]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ _argvec[9] = (unsigned long)(arg9); \ -+ _argvec[10] = (unsigned long)(arg10); \ -+ _argvec[11] = (unsigned long)(arg11); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "lw $4, 20(%1) \n\t" \ -+ "subu $29, $29, 48\n\t" \ -+ "sw $4, 16($29) \n\t" \ -+ "lw $4, 24(%1) \n\t" \ -+ "sw $4, 20($29) \n\t" \ -+ "lw $4, 28(%1) \n\t" \ -+ "sw $4, 24($29) \n\t" \ -+ "lw $4, 32(%1) \n\t" \ -+ "sw $4, 28($29) \n\t" \ -+ "lw $4, 36(%1) \n\t" \ -+ "sw $4, 32($29) \n\t" \ -+ "lw $4, 40(%1) \n\t" \ -+ "sw $4, 36($29) \n\t" \ -+ "lw $4, 44(%1) \n\t" \ -+ "sw $4, 40($29) \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $7, 16(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 48 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "0" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__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 = (orig); \ -+ volatile unsigned long _argvec[13]; \ -+ volatile unsigned long _res; \ -+ _argvec[0] = (unsigned long)_orig.nraddr; \ -+ _argvec[1] = (unsigned long)(arg1); \ -+ _argvec[2] = (unsigned long)(arg2); \ -+ _argvec[3] = (unsigned long)(arg3); \ -+ _argvec[4] = (unsigned long)(arg4); \ -+ _argvec[5] = (unsigned long)(arg5); \ -+ _argvec[6] = (unsigned long)(arg6); \ -+ _argvec[7] = (unsigned long)(arg7); \ -+ _argvec[8] = (unsigned long)(arg8); \ -+ _argvec[9] = (unsigned long)(arg9); \ -+ _argvec[10] = (unsigned long)(arg10); \ -+ _argvec[11] = (unsigned long)(arg11); \ -+ _argvec[12] = (unsigned long)(arg12); \ -+ __asm__ volatile( \ -+ "subu $29, $29, 8 \n\t" \ -+ "sw $28, 0($29) \n\t" \ -+ "sw $31, 4($29) \n\t" \ -+ "lw $4, 20(%1) \n\t" \ -+ "subu $29, $29, 56\n\t" \ -+ "sw $4, 16($29) \n\t" \ -+ "lw $4, 24(%1) \n\t" \ -+ "sw $4, 20($29) \n\t" \ -+ "lw $4, 28(%1) \n\t" \ -+ "sw $4, 24($29) \n\t" \ -+ "lw $4, 32(%1) \n\t" \ -+ "sw $4, 28($29) \n\t" \ -+ "lw $4, 36(%1) \n\t" \ -+ "sw $4, 32($29) \n\t" \ -+ "lw $4, 40(%1) \n\t" \ -+ "sw $4, 36($29) \n\t" \ -+ "lw $4, 44(%1) \n\t" \ -+ "sw $4, 40($29) \n\t" \ -+ "lw $4, 48(%1) \n\t" \ -+ "sw $4, 44($29) \n\t" \ -+ "lw $4, 4(%1) \n\t" \ -+ "lw $5, 8(%1) \n\t" \ -+ "lw $6, 12(%1) \n\t" \ -+ "lw $7, 16(%1) \n\t" \ -+ "lw $25, 0(%1) \n\t" /* target->t9 */ \ -+ VALGRIND_CALL_NOREDIR_T9 \ -+ "addu $29, $29, 56 \n\t" \ -+ "lw $28, 0($29) \n\t" \ -+ "lw $31, 4($29) \n\t" \ -+ "addu $29, $29, 8 \n\t" \ -+ "move %0, $2\n" \ -+ : /*out*/ "=r" (_res) \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ -+ ); \ -+ lval = (__typeof__(lval)) _res; \ -+ } while (0) - --#endif /* PLAT_s390x_linux */ -+#endif /* PLAT_mips32_linux */ - --/* ------------------------- mips-linux ------------------------- */ -- --#if defined(PLAT_mips32_linux) -+/* ------------------------- mips64-linux ------------------------- */ -+ -+#if defined(PLAT_mips64_linux) - - /* These regs are trashed by the hidden call. */ - #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \ -@@ -3900,20 +5685,12 @@ typedef - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "subu $29, $29, 16 \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $29, $29, 16\n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $29, $29, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3921,26 +5698,18 @@ typedef - #define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ -- volatile unsigned long _argvec[2]; \ -+ volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "subu $29, $29, 16 \n\t" \ -- "lw $a0, 4(%1) \n\t" /* arg1*/ \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "ld $4, 8(%1)\n\t" /* arg1*/ \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $29, $29, 16 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $29, $29, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3954,22 +5723,14 @@ typedef - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "subu $29, $29, 16 \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $29, $29, 16 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $29, $29, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -3984,23 +5745,15 @@ typedef - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "subu $29, $29, 16 \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $29, $29, 16 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $29, $29, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -4016,24 +5769,16 @@ typedef - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "subu $29, $29, 16 \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $a3, 16(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $7, 32(%1)\n\t" \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $29, $29, 16 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $29, $29, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -4050,29 +5795,21 @@ typedef - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "lw $a0, 20(%1) \n\t" \ -- "subu $sp, $sp, 24\n\t" \ -- "sw $a0, 16($sp) \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $a3, 16(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $7, 32(%1)\n\t" \ -+ "ld $8, 40(%1)\n\t" \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $29, $29, 24 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $sp, $sp, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -+ - #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ -@@ -4086,29 +5823,18 @@ typedef - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "lw $a0, 20(%1) \n\t" \ -- "subu $sp, $sp, 32\n\t" \ -- "sw $a0, 16($sp) \n\t" \ -- "lw $a0, 24(%1) \n\t" \ -- "nop\n\t" \ -- "sw $a0, 20($sp) \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $a3, 16(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $7, 32(%1)\n\t" \ -+ "ld $8, 40(%1)\n\t" \ -+ "ld $9, 48(%1)\n\t" \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $sp, $sp, 32 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $sp, $sp, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -4128,30 +5854,19 @@ typedef - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "lw $a0, 20(%1) \n\t" \ -- "subu $sp, $sp, 32\n\t" \ -- "sw $a0, 16($sp) \n\t" \ -- "lw $a0, 24(%1) \n\t" \ -- "sw $a0, 20($sp) \n\t" \ -- "lw $a0, 28(%1) \n\t" \ -- "sw $a0, 24($sp) \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $a3, 16(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $7, 32(%1)\n\t" \ -+ "ld $8, 40(%1)\n\t" \ -+ "ld $9, 48(%1)\n\t" \ -+ "ld $10, 56(%1)\n\t" \ -+ "ld $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $sp, $sp, 32 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $sp, $sp, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -4172,32 +5887,20 @@ typedef - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "lw $a0, 20(%1) \n\t" \ -- "subu $sp, $sp, 40\n\t" \ -- "sw $a0, 16($sp) \n\t" \ -- "lw $a0, 24(%1) \n\t" \ -- "sw $a0, 20($sp) \n\t" \ -- "lw $a0, 28(%1) \n\t" \ -- "sw $a0, 24($sp) \n\t" \ -- "lw $a0, 32(%1) \n\t" \ -- "sw $a0, 28($sp) \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $a3, 16(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $7, 32(%1)\n\t" \ -+ "ld $8, 40(%1)\n\t" \ -+ "ld $9, 48(%1)\n\t" \ -+ "ld $10, 56(%1)\n\t" \ -+ "ld $11, 64(%1)\n\t" \ -+ "ld $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $sp, $sp, 40 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $sp, $sp, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -4219,34 +5922,24 @@ typedef - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "lw $a0, 20(%1) \n\t" \ -- "subu $sp, $sp, 40\n\t" \ -- "sw $a0, 16($sp) \n\t" \ -- "lw $a0, 24(%1) \n\t" \ -- "sw $a0, 20($sp) \n\t" \ -- "lw $a0, 28(%1) \n\t" \ -- "sw $a0, 24($sp) \n\t" \ -- "lw $a0, 32(%1) \n\t" \ -- "sw $a0, 28($sp) \n\t" \ -- "lw $a0, 36(%1) \n\t" \ -- "sw $a0, 32($sp) \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $a3, 16(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "dsubu $29, $29, 8\n\t" \ -+ "ld $4, 72(%1)\n\t" \ -+ "sd $4, 0($29)\n\t" \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $7, 32(%1)\n\t" \ -+ "ld $8, 40(%1)\n\t" \ -+ "ld $9, 48(%1)\n\t" \ -+ "ld $10, 56(%1)\n\t" \ -+ "ld $11, 64(%1)\n\t" \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $sp, $sp, 40 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $sp, $sp, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "daddu $29, $29, 8\n\t" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -4269,36 +5962,26 @@ typedef - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "lw $a0, 20(%1) \n\t" \ -- "subu $sp, $sp, 48\n\t" \ -- "sw $a0, 16($sp) \n\t" \ -- "lw $a0, 24(%1) \n\t" \ -- "sw $a0, 20($sp) \n\t" \ -- "lw $a0, 28(%1) \n\t" \ -- "sw $a0, 24($sp) \n\t" \ -- "lw $a0, 32(%1) \n\t" \ -- "sw $a0, 28($sp) \n\t" \ -- "lw $a0, 36(%1) \n\t" \ -- "sw $a0, 32($sp) \n\t" \ -- "lw $a0, 40(%1) \n\t" \ -- "sw $a0, 36($sp) \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $a3, 16(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "dsubu $29, $29, 16\n\t" \ -+ "ld $4, 72(%1)\n\t" \ -+ "sd $4, 0($29)\n\t" \ -+ "ld $4, 80(%1)\n\t" \ -+ "sd $4, 8($29)\n\t" \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $7, 32(%1)\n\t" \ -+ "ld $8, 40(%1)\n\t" \ -+ "ld $9, 48(%1)\n\t" \ -+ "ld $10, 56(%1)\n\t" \ -+ "ld $11, 64(%1)\n\t" \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $sp, $sp, 48 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $sp, $sp, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "daddu $29, $29, 16\n\t" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -4323,38 +6006,28 @@ typedef - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "lw $a0, 20(%1) \n\t" \ -- "subu $sp, $sp, 48\n\t" \ -- "sw $a0, 16($sp) \n\t" \ -- "lw $a0, 24(%1) \n\t" \ -- "sw $a0, 20($sp) \n\t" \ -- "lw $a0, 28(%1) \n\t" \ -- "sw $a0, 24($sp) \n\t" \ -- "lw $a0, 32(%1) \n\t" \ -- "sw $a0, 28($sp) \n\t" \ -- "lw $a0, 36(%1) \n\t" \ -- "sw $a0, 32($sp) \n\t" \ -- "lw $a0, 40(%1) \n\t" \ -- "sw $a0, 36($sp) \n\t" \ -- "lw $a0, 44(%1) \n\t" \ -- "sw $a0, 40($sp) \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $a3, 16(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "dsubu $29, $29, 24\n\t" \ -+ "ld $4, 72(%1)\n\t" \ -+ "sd $4, 0($29)\n\t" \ -+ "ld $4, 80(%1)\n\t" \ -+ "sd $4, 8($29)\n\t" \ -+ "ld $4, 88(%1)\n\t" \ -+ "sd $4, 16($29)\n\t" \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $7, 32(%1)\n\t" \ -+ "ld $8, 40(%1)\n\t" \ -+ "ld $9, 48(%1)\n\t" \ -+ "ld $10, 56(%1)\n\t" \ -+ "ld $11, 64(%1)\n\t" \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $sp, $sp, 48 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $sp, $sp, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "daddu $29, $29, 24\n\t" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -@@ -4380,45 +6053,35 @@ typedef - _argvec[11] = (unsigned long)(arg11); \ - _argvec[12] = (unsigned long)(arg12); \ - __asm__ volatile( \ -- "subu $29, $29, 8 \n\t" \ -- "sw $gp, 0($sp) \n\t" \ -- "sw $ra, 4($sp) \n\t" \ -- "lw $a0, 20(%1) \n\t" \ -- "subu $sp, $sp, 56\n\t" \ -- "sw $a0, 16($sp) \n\t" \ -- "lw $a0, 24(%1) \n\t" \ -- "sw $a0, 20($sp) \n\t" \ -- "lw $a0, 28(%1) \n\t" \ -- "sw $a0, 24($sp) \n\t" \ -- "lw $a0, 32(%1) \n\t" \ -- "sw $a0, 28($sp) \n\t" \ -- "lw $a0, 36(%1) \n\t" \ -- "sw $a0, 32($sp) \n\t" \ -- "lw $a0, 40(%1) \n\t" \ -- "sw $a0, 36($sp) \n\t" \ -- "lw $a0, 44(%1) \n\t" \ -- "sw $a0, 40($sp) \n\t" \ -- "lw $a0, 48(%1) \n\t" \ -- "sw $a0, 44($sp) \n\t" \ -- "lw $a0, 4(%1) \n\t" \ -- "lw $a1, 8(%1) \n\t" \ -- "lw $a2, 12(%1) \n\t" \ -- "lw $a3, 16(%1) \n\t" \ -- "lw $t9, 0(%1) \n\t" /* target->t9 */ \ -+ "dsubu $29, $29, 32\n\t" \ -+ "ld $4, 72(%1)\n\t" \ -+ "sd $4, 0($29)\n\t" \ -+ "ld $4, 80(%1)\n\t" \ -+ "sd $4, 8($29)\n\t" \ -+ "ld $4, 88(%1)\n\t" \ -+ "sd $4, 16($29)\n\t" \ -+ "ld $4, 96(%1)\n\t" \ -+ "sd $4, 24($29)\n\t" \ -+ "ld $4, 8(%1)\n\t" \ -+ "ld $5, 16(%1)\n\t" \ -+ "ld $6, 24(%1)\n\t" \ -+ "ld $7, 32(%1)\n\t" \ -+ "ld $8, 40(%1)\n\t" \ -+ "ld $9, 48(%1)\n\t" \ -+ "ld $10, 56(%1)\n\t" \ -+ "ld $11, 64(%1)\n\t" \ -+ "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ -- "addu $sp, $sp, 56 \n\t" \ -- "lw $gp, 0($sp) \n\t" \ -- "lw $ra, 4($sp) \n\t" \ -- "addu $sp, $sp, 8 \n\t" \ -- "move %0, $v0\n" \ -+ "daddu $29, $29, 32\n\t" \ -+ "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ -- : /*in*/ "0" (&_argvec[0]) \ -- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ -+ : /*in*/ "r" (&_argvec[0]) \ -+ : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - --#endif /* PLAT_mips32_linux */ -+#endif /* PLAT_mips64_linux */ - - - /* ------------------------------------------------------------------ */ -@@ -4464,8 +6127,8 @@ typedef - errors. */ - VG_USERREQ__COUNT_ERRORS = 0x1201, - -- /* Allows a string (gdb monitor command) to be passed to the tool -- Used for interaction with vgdb/gdb */ -+ /* Allows the client program and/or gdbserver to execute a monitor -+ command. */ - VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202, - - /* These are useful and can be interpreted by any tool that -@@ -4562,14 +6225,14 @@ VALGRIND_PRINTF(const char *format, ...) - #if defined(NVALGRIND) - return 0; - #else /* NVALGRIND */ --#if defined(_MSC_VER) -+#if defined(_MSC_VER) || defined(__MINGW64__) - uintptr_t _qzz_res; - #else - unsigned long _qzz_res; - #endif - va_list vargs; - va_start(vargs, format); --#if defined(_MSC_VER) -+#if defined(_MSC_VER) || defined(__MINGW64__) - _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, - VG_USERREQ__PRINTF_VALIST_BY_REF, - (uintptr_t)format, -@@ -4600,14 +6263,14 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) - #if defined(NVALGRIND) - return 0; - #else /* NVALGRIND */ --#if defined(_MSC_VER) -+#if defined(_MSC_VER) || defined(__MINGW64__) - uintptr_t _qzz_res; - #else - unsigned long _qzz_res; - #endif - va_list vargs; - va_start(vargs, format); --#if defined(_MSC_VER) -+#if defined(_MSC_VER) || defined(__MINGW64__) - _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, - VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, - (uintptr_t)format, -@@ -4844,7 +6507,9 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) - VG_USERREQ__MEMPOOL_EXISTS, \ - pool, 0, 0, 0, 0) - --/* Mark a piece of memory as being a stack. Returns a stack id. */ -+/* Mark a piece of memory as being a stack. Returns a stack id. -+ start is the lowest addressable stack byte, end is the highest -+ addressable stack byte. */ - #define VALGRIND_STACK_REGISTER(start, end) \ - (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ - VG_USERREQ__STACK_REGISTER, \ -@@ -4856,7 +6521,9 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \ - id, 0, 0, 0, 0) - --/* Change the start and end address of the stack id. */ -+/* Change the start and end address of the stack id. -+ start is the new lowest addressable stack byte, end is the new highest -+ addressable stack byte. */ - #define VALGRIND_STACK_CHANGE(id, start, end) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \ - id, start, end, 0, 0) -@@ -4893,15 +6560,28 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \ - -1, 0, 0, 0, 0) - -+/* Execute a monitor command from the client program. -+ If a connection is opened with GDB, the output will be sent -+ according to the output mode set for vgdb. -+ If no connection is opened, output will go to the log output. -+ Returns 1 if command not recognised, 0 otherwise. */ -+#define VALGRIND_MONITOR_COMMAND(command) \ -+ VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \ -+ command, 0, 0, 0, 0) -+ -+ - #undef PLAT_x86_darwin - #undef PLAT_amd64_darwin - #undef PLAT_x86_win32 -+#undef PLAT_amd64_win64 - #undef PLAT_x86_linux - #undef PLAT_amd64_linux - #undef PLAT_ppc32_linux --#undef PLAT_ppc64_linux -+#undef PLAT_ppc64be_linux -+#undef PLAT_ppc64le_linux - #undef PLAT_arm_linux - #undef PLAT_s390x_linux - #undef PLAT_mips32_linux -+#undef PLAT_mips64_linux - - #endif /* __VALGRIND_H */ diff --git a/wine-mono.spec b/wine-mono.spec index a583a62..b060960 100644 --- a/wine-mono.spec +++ b/wine-mono.spec @@ -2,23 +2,19 @@ %{?mingw_package_header} Name: wine-mono -Version: 4.5.6 -Release: 6%{?dist} +Version: 4.6.0 +Release: 1%{?dist} Summary: Mono library required for Wine License: GPLv2 and LGPLv2 and MIT and BSD and MS-PL and MPLv1.1 Group: Development/Libraries URL: http://wiki.winehq.org/Mono -Source0: http://sourceforge.net/projects/wine/files/Wine%20Mono/%{version}/%{name}-%{version}.tar.gz +Source0: http://dl.winehq.org/wine/wine-mono/%{version}/wine-mono-%{version}.tar.gz Patch0: wine-mono-build-msifilename.patch -# https://github.com/mono/mono/commit/1445d4821c8091c395264542344dca9df22a2c82 -Patch1: wine-mono-valgrind.patch # to statically link in winpthreads -Patch2: wine-mono-build-static.patch -# https://github.com/mono/mono/commit/16ee0252305fbd4f40ea39c3c4421dc7f103f8a0 -Patch3: wine-mono-tls.patch +Patch1: wine-mono-build-static.patch # this function gets optimized out when inlined -Patch4: wine-mono-build-inline.patch +Patch2: wine-mono-build-inline.patch # see git://github.com/madewokherd/wine-mono @@ -60,13 +56,11 @@ Windows Mono library required for Wine. %prep %setup -q %patch0 -p1 -b.msifilename -%patch1 -dmono -p1 -b.valgrind -%patch2 -p1 -b.static -%patch3 -dmono -p1 -b.tls -%patch4 -p1 -b.inline +%patch1 -p1 -b.static +%patch2 -p1 -b.inline %build -MAKEOPTS=%{_smp_mflags} MSIFILENAME=wine-mono-%{version}.msi ./build-winemono.sh +MAKEOPTS=%{_smp_mflags} MSIFILENAME=wine-mono-%{version}.msi ./build-winemono.sh.static %install mkdir -p %{buildroot}%{_datadir}/wine/mono @@ -100,6 +94,9 @@ cp mono-basic/LICENSE mono-basic-LICENSE %{_datadir}/wine/mono/wine-mono-%{version}.msi %changelog +* Tue Mar 08 2016 Michael Cronenworth - 4.6.0-1 +- version upgrade + * Fri Feb 05 2016 Fedora Release Engineering - 4.5.6-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild