xref: /petsc/include/petsc/private/valgrind/valgrind.h (revision 80f6d96d0ce89eaa1a15cf9ca02d8013bede711a)
16edef35eSSatish Balay /* -*- c -*-
26edef35eSSatish Balay    ----------------------------------------------------------------
36edef35eSSatish Balay 
46edef35eSSatish Balay    Notice that the following BSD-style license applies to this one
56edef35eSSatish Balay    file (valgrind.h) only.  The rest of Valgrind is licensed under the
66edef35eSSatish Balay    terms of the GNU General Public License, version 2, unless
76edef35eSSatish Balay    otherwise indicated.  See the COPYING file in the source
86edef35eSSatish Balay    distribution for details.
96edef35eSSatish Balay 
106edef35eSSatish Balay    ----------------------------------------------------------------
116edef35eSSatish Balay 
126edef35eSSatish Balay    This file is part of Valgrind, a dynamic binary instrumentation
136edef35eSSatish Balay    framework.
146edef35eSSatish Balay 
156edef35eSSatish Balay    Copyright (C) 2000-2017 Julian Seward.  All rights reserved.
166edef35eSSatish Balay 
176edef35eSSatish Balay    Redistribution and use in source and binary forms, with or without
186edef35eSSatish Balay    modification, are permitted provided that the following conditions
196edef35eSSatish Balay    are met:
206edef35eSSatish Balay 
216edef35eSSatish Balay    1. Redistributions of source code must retain the above copyright
226edef35eSSatish Balay       notice, this list of conditions and the following disclaimer.
236edef35eSSatish Balay 
246edef35eSSatish Balay    2. The origin of this software must not be misrepresented; you must
256edef35eSSatish Balay       not claim that you wrote the original software.  If you use this
266edef35eSSatish Balay       software in a product, an acknowledgment in the product
276edef35eSSatish Balay       documentation would be appreciated but is not required.
286edef35eSSatish Balay 
296edef35eSSatish Balay    3. Altered source versions must be plainly marked as such, and must
306edef35eSSatish Balay       not be misrepresented as being the original software.
316edef35eSSatish Balay 
326edef35eSSatish Balay    4. The name of the author may not be used to endorse or promote
336edef35eSSatish Balay       products derived from this software without specific prior written
346edef35eSSatish Balay       permission.
356edef35eSSatish Balay 
366edef35eSSatish Balay    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
376edef35eSSatish Balay    OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
386edef35eSSatish Balay    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
396edef35eSSatish Balay    ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
406edef35eSSatish Balay    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
416edef35eSSatish Balay    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
426edef35eSSatish Balay    GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
436edef35eSSatish Balay    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
446edef35eSSatish Balay    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
456edef35eSSatish Balay    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
466edef35eSSatish Balay    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
476edef35eSSatish Balay 
486edef35eSSatish Balay    ----------------------------------------------------------------
496edef35eSSatish Balay 
506edef35eSSatish Balay    Notice that the above BSD-style license applies to this one file
516edef35eSSatish Balay    (valgrind.h) only.  The entire rest of Valgrind is licensed under
526edef35eSSatish Balay    the terms of the GNU General Public License, version 2.  See the
536edef35eSSatish Balay    COPYING file in the source distribution for details.
546edef35eSSatish Balay 
556edef35eSSatish Balay    ----------------------------------------------------------------
566edef35eSSatish Balay */
576edef35eSSatish Balay 
586edef35eSSatish Balay 
596edef35eSSatish Balay /* This file is for inclusion into client (your!) code.
606edef35eSSatish Balay 
616edef35eSSatish Balay    You can use these macros to manipulate and query Valgrind's
626edef35eSSatish Balay    execution inside your own programs.
636edef35eSSatish Balay 
646edef35eSSatish Balay    The resulting executables will still run without Valgrind, just a
656edef35eSSatish Balay    little bit more slowly than they otherwise would, but otherwise
666edef35eSSatish Balay    unchanged.  When not running on valgrind, each client request
676edef35eSSatish Balay    consumes very few (eg. 7) instructions, so the resulting performance
686edef35eSSatish Balay    loss is negligible unless you plan to execute client requests
696edef35eSSatish Balay    millions of times per second.  Nevertheless, if that is still a
706edef35eSSatish Balay    problem, you can compile with the NVALGRIND symbol defined (gcc
716edef35eSSatish Balay    -DNVALGRIND) so that client requests are not even compiled in.  */
726edef35eSSatish Balay 
736edef35eSSatish Balay #ifndef __VALGRIND_H
746edef35eSSatish Balay #define __VALGRIND_H
756edef35eSSatish Balay 
766edef35eSSatish Balay 
776edef35eSSatish Balay /* ------------------------------------------------------------------ */
786edef35eSSatish Balay /* VERSION NUMBER OF VALGRIND                                         */
796edef35eSSatish Balay /* ------------------------------------------------------------------ */
806edef35eSSatish Balay 
816edef35eSSatish Balay /* Specify Valgrind's version number, so that user code can
826edef35eSSatish Balay    conditionally compile based on our version number.  Note that these
836edef35eSSatish Balay    were introduced at version 3.6 and so do not exist in version 3.5
846edef35eSSatish Balay    or earlier.  The recommended way to use them to check for "version
856edef35eSSatish Balay    X.Y or later" is (eg)
866edef35eSSatish Balay 
876edef35eSSatish Balay #if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__)   \
886edef35eSSatish Balay     && (__VALGRIND_MAJOR__ > 3                                   \
896edef35eSSatish Balay         || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6))
906edef35eSSatish Balay */
916edef35eSSatish Balay #define __VALGRIND_MAJOR__    3
92cea3dcb8SSatish Balay #define __VALGRIND_MINOR__    19
936edef35eSSatish Balay 
946edef35eSSatish Balay 
956edef35eSSatish Balay #include <stdarg.h>
966edef35eSSatish Balay 
976edef35eSSatish Balay /* Nb: this file might be included in a file compiled with -ansi.  So
986edef35eSSatish Balay    we can't use C++ style "//" comments nor the "asm" keyword (instead
996edef35eSSatish Balay    use "__asm__"). */
1006edef35eSSatish Balay 
1016edef35eSSatish Balay /* Derive some tags indicating what the target platform is.  Note
1026edef35eSSatish Balay    that in this file we're using the compiler's CPP symbols for
1036edef35eSSatish Balay    identifying architectures, which are different to the ones we use
1046edef35eSSatish Balay    within the rest of Valgrind.  Note, __powerpc__ is active for both
1056edef35eSSatish Balay    32 and 64-bit PPC, whereas __powerpc64__ is only active for the
1066edef35eSSatish Balay    latter (on Linux, that is).
1076edef35eSSatish Balay 
1086edef35eSSatish Balay    Misc note: how to find out what's predefined in gcc by default:
1096edef35eSSatish Balay    gcc -Wp,-dM somefile.c
1106edef35eSSatish Balay */
1116edef35eSSatish Balay #undef PLAT_x86_darwin
1126edef35eSSatish Balay #undef PLAT_amd64_darwin
113cea3dcb8SSatish Balay #undef PLAT_x86_freebsd
114cea3dcb8SSatish Balay #undef PLAT_amd64_freebsd
1156edef35eSSatish Balay #undef PLAT_x86_win32
1166edef35eSSatish Balay #undef PLAT_amd64_win64
1176edef35eSSatish Balay #undef PLAT_x86_linux
1186edef35eSSatish Balay #undef PLAT_amd64_linux
1196edef35eSSatish Balay #undef PLAT_ppc32_linux
1206edef35eSSatish Balay #undef PLAT_ppc64be_linux
1216edef35eSSatish Balay #undef PLAT_ppc64le_linux
1226edef35eSSatish Balay #undef PLAT_arm_linux
1236edef35eSSatish Balay #undef PLAT_arm64_linux
1246edef35eSSatish Balay #undef PLAT_s390x_linux
1256edef35eSSatish Balay #undef PLAT_mips32_linux
1266edef35eSSatish Balay #undef PLAT_mips64_linux
1276edef35eSSatish Balay #undef PLAT_nanomips_linux
1286edef35eSSatish Balay #undef PLAT_x86_solaris
1296edef35eSSatish Balay #undef PLAT_amd64_solaris
1306edef35eSSatish Balay 
1316edef35eSSatish Balay 
1326edef35eSSatish Balay #if defined(__APPLE__) && defined(__i386__)
1336edef35eSSatish Balay #  define PLAT_x86_darwin 1
1346edef35eSSatish Balay #elif defined(__APPLE__) && defined(__x86_64__)
1356edef35eSSatish Balay #  define PLAT_amd64_darwin 1
136cea3dcb8SSatish Balay #elif defined(__FreeBSD__) && defined(__i386__)
137cea3dcb8SSatish Balay #  define PLAT_x86_freebsd 1
138cea3dcb8SSatish Balay #elif defined(__FreeBSD__) && defined(__amd64__)
139cea3dcb8SSatish Balay #  define PLAT_amd64_freebsd 1
1406edef35eSSatish Balay #elif (defined(__MINGW32__) && defined(__i386__)) \
1416edef35eSSatish Balay       || defined(__CYGWIN32__) \
1426edef35eSSatish Balay       || (defined(_WIN32) && defined(_M_IX86))
1436edef35eSSatish Balay #  define PLAT_x86_win32 1
1446edef35eSSatish Balay #elif (defined(__MINGW32__) && defined(__x86_64__)) \
1456edef35eSSatish Balay       || (defined(_WIN32) && defined(_M_X64))
1466edef35eSSatish Balay /* __MINGW32__ and _WIN32 are defined in 64 bit mode as well. */
1476edef35eSSatish Balay #  define PLAT_amd64_win64 1
1486edef35eSSatish Balay #elif defined(__linux__) && defined(__i386__)
1496edef35eSSatish Balay #  define PLAT_x86_linux 1
1506edef35eSSatish Balay #elif defined(__linux__) && defined(__x86_64__) && !defined(__ILP32__)
1516edef35eSSatish Balay #  define PLAT_amd64_linux 1
1526edef35eSSatish Balay #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
1536edef35eSSatish Balay #  define PLAT_ppc32_linux 1
1546edef35eSSatish Balay #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF != 2
1556edef35eSSatish Balay /* Big Endian uses ELF version 1 */
1566edef35eSSatish Balay #  define PLAT_ppc64be_linux 1
1576edef35eSSatish Balay #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF == 2
1586edef35eSSatish Balay /* Little Endian uses ELF version 2 */
1596edef35eSSatish Balay #  define PLAT_ppc64le_linux 1
1606edef35eSSatish Balay #elif defined(__linux__) && defined(__arm__) && !defined(__aarch64__)
1616edef35eSSatish Balay #  define PLAT_arm_linux 1
1626edef35eSSatish Balay #elif defined(__linux__) && defined(__aarch64__) && !defined(__arm__)
1636edef35eSSatish Balay #  define PLAT_arm64_linux 1
1646edef35eSSatish Balay #elif defined(__linux__) && defined(__s390__) && defined(__s390x__)
1656edef35eSSatish Balay #  define PLAT_s390x_linux 1
1666edef35eSSatish Balay #elif defined(__linux__) && defined(__mips__) && (__mips==64)
1676edef35eSSatish Balay #  define PLAT_mips64_linux 1
1686edef35eSSatish Balay #elif defined(__linux__) && defined(__mips__) && (__mips==32)
1696edef35eSSatish Balay #  define PLAT_mips32_linux 1
1706edef35eSSatish Balay #elif defined(__linux__) && defined(__nanomips__)
1716edef35eSSatish Balay #  define PLAT_nanomips_linux 1
1726edef35eSSatish Balay #elif defined(__sun) && defined(__i386__)
1736edef35eSSatish Balay #  define PLAT_x86_solaris 1
1746edef35eSSatish Balay #elif defined(__sun) && defined(__x86_64__)
1756edef35eSSatish Balay #  define PLAT_amd64_solaris 1
1766edef35eSSatish Balay #else
1776edef35eSSatish Balay /* If we're not compiling for our target platform, don't generate
1786edef35eSSatish Balay    any inline asms.  */
1796edef35eSSatish Balay #  if !defined(NVALGRIND)
1806edef35eSSatish Balay #    define NVALGRIND 1
1816edef35eSSatish Balay #  endif
1826edef35eSSatish Balay #endif
1836edef35eSSatish Balay 
1846edef35eSSatish Balay 
1856edef35eSSatish Balay /* ------------------------------------------------------------------ */
1866edef35eSSatish Balay /* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS.  There is nothing */
1876edef35eSSatish Balay /* in here of use to end-users -- skip to the next section.           */
1886edef35eSSatish Balay /* ------------------------------------------------------------------ */
1896edef35eSSatish Balay 
1906edef35eSSatish Balay /*
1916edef35eSSatish Balay  * VALGRIND_DO_CLIENT_REQUEST(): a statement that invokes a Valgrind client
1926edef35eSSatish Balay  * request. Accepts both pointers and integers as arguments.
1936edef35eSSatish Balay  *
1946edef35eSSatish Balay  * VALGRIND_DO_CLIENT_REQUEST_STMT(): a statement that invokes a Valgrind
1956edef35eSSatish Balay  * client request that does not return a value.
1966edef35eSSatish Balay 
1976edef35eSSatish Balay  * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind
1986edef35eSSatish Balay  * client request and whose value equals the client request result.  Accepts
1996edef35eSSatish Balay  * both pointers and integers as arguments.  Note that such calls are not
2006edef35eSSatish Balay  * necessarily pure functions -- they may have side effects.
2016edef35eSSatish Balay  */
2026edef35eSSatish Balay 
2036edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default,            \
2046edef35eSSatish Balay                                    _zzq_request, _zzq_arg1, _zzq_arg2,  \
2056edef35eSSatish Balay                                    _zzq_arg3, _zzq_arg4, _zzq_arg5)     \
2066edef35eSSatish Balay   do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default),   \
2076edef35eSSatish Balay                         (_zzq_request), (_zzq_arg1), (_zzq_arg2),       \
2086edef35eSSatish Balay                         (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
2096edef35eSSatish Balay 
2106edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1,        \
2116edef35eSSatish Balay                            _zzq_arg2,  _zzq_arg3, _zzq_arg4, _zzq_arg5) \
2126edef35eSSatish Balay   do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                        \
2136edef35eSSatish Balay                     (_zzq_request), (_zzq_arg1), (_zzq_arg2),           \
2146edef35eSSatish Balay                     (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
2156edef35eSSatish Balay 
2166edef35eSSatish Balay #if defined(NVALGRIND)
2176edef35eSSatish Balay 
2186edef35eSSatish Balay /* Define NVALGRIND to completely remove the Valgrind magic sequence
2196edef35eSSatish Balay    from the compiled code (analogous to NDEBUG's effects on
2206edef35eSSatish Balay    assert()) */
2216edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
2226edef35eSSatish Balay         _zzq_default, _zzq_request,                               \
2236edef35eSSatish Balay         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
2246edef35eSSatish Balay       (_zzq_default)
2256edef35eSSatish Balay 
2266edef35eSSatish Balay #else  /* ! NVALGRIND */
2276edef35eSSatish Balay 
2286edef35eSSatish Balay /* The following defines the magic code sequences which the JITter
2296edef35eSSatish Balay    spots and handles magically.  Don't look too closely at them as
2306edef35eSSatish Balay    they will rot your brain.
2316edef35eSSatish Balay 
2326edef35eSSatish Balay    The assembly code sequences for all architectures is in this one
2336edef35eSSatish Balay    file.  This is because this file must be stand-alone, and we don't
2346edef35eSSatish Balay    want to have multiple files.
2356edef35eSSatish Balay 
2366edef35eSSatish Balay    For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default
2376edef35eSSatish Balay    value gets put in the return slot, so that everything works when
2386edef35eSSatish Balay    this is executed not under Valgrind.  Args are passed in a memory
2396edef35eSSatish Balay    block, and so there's no intrinsic limit to the number that could
2406edef35eSSatish Balay    be passed, but it's currently five.
2416edef35eSSatish Balay 
2426edef35eSSatish Balay    The macro args are:
2436edef35eSSatish Balay       _zzq_rlval    result lvalue
2446edef35eSSatish Balay       _zzq_default  default value (result returned when running on real CPU)
2456edef35eSSatish Balay       _zzq_request  request code
2466edef35eSSatish Balay       _zzq_arg1..5  request params
2476edef35eSSatish Balay 
2486edef35eSSatish Balay    The other two macros are used to support function wrapping, and are
2496edef35eSSatish Balay    a lot simpler.  VALGRIND_GET_NR_CONTEXT returns the value of the
2506edef35eSSatish Balay    guest's NRADDR pseudo-register and whatever other information is
2516edef35eSSatish Balay    needed to safely run the call original from the wrapper: on
2526edef35eSSatish Balay    ppc64-linux, the R2 value at the divert point is also needed.  This
2536edef35eSSatish Balay    information is abstracted into a user-visible type, OrigFn.
2546edef35eSSatish Balay 
2556edef35eSSatish Balay    VALGRIND_CALL_NOREDIR_* behaves the same as the following on the
2566edef35eSSatish Balay    guest, but guarantees that the branch instruction will not be
2576edef35eSSatish Balay    redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64:
2586edef35eSSatish Balay    branch-and-link-to-r11.  VALGRIND_CALL_NOREDIR is just text, not a
2596edef35eSSatish Balay    complete inline asm, since it needs to be combined with more magic
2606edef35eSSatish Balay    inline asm stuff to be useful.
2616edef35eSSatish Balay */
2626edef35eSSatish Balay 
2636edef35eSSatish Balay /* ----------------- x86-{linux,darwin,solaris} ---------------- */
2646edef35eSSatish Balay 
2656edef35eSSatish Balay #if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)  \
2666edef35eSSatish Balay     ||  (defined(PLAT_x86_win32) && defined(__GNUC__)) \
267cea3dcb8SSatish Balay     ||  defined(PLAT_x86_solaris) || defined(PLAT_x86_freebsd)
2686edef35eSSatish Balay 
2696edef35eSSatish Balay typedef
2706edef35eSSatish Balay    struct {
2716edef35eSSatish Balay       unsigned int nraddr; /* where's the code? */
2726edef35eSSatish Balay    }
2736edef35eSSatish Balay    OrigFn;
2746edef35eSSatish Balay 
2756edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
2766edef35eSSatish Balay                      "roll $3,  %%edi ; roll $13, %%edi\n\t"      \
2776edef35eSSatish Balay                      "roll $29, %%edi ; roll $19, %%edi\n\t"
2786edef35eSSatish Balay 
2796edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
2806edef35eSSatish Balay         _zzq_default, _zzq_request,                               \
2816edef35eSSatish Balay         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
2826edef35eSSatish Balay   __extension__                                                   \
2836edef35eSSatish Balay   ({volatile unsigned int _zzq_args[6];                           \
2846edef35eSSatish Balay     volatile unsigned int _zzq_result;                            \
2856edef35eSSatish Balay     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
2866edef35eSSatish Balay     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
2876edef35eSSatish Balay     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
2886edef35eSSatish Balay     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
2896edef35eSSatish Balay     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
2906edef35eSSatish Balay     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
2916edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
2926edef35eSSatish Balay                      /* %EDX = client_request ( %EAX ) */         \
2936edef35eSSatish Balay                      "xchgl %%ebx,%%ebx"                          \
2946edef35eSSatish Balay                      : "=d" (_zzq_result)                         \
2956edef35eSSatish Balay                      : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
2966edef35eSSatish Balay                      : "cc", "memory"                             \
2976edef35eSSatish Balay                     );                                            \
2986edef35eSSatish Balay     _zzq_result;                                                  \
2996edef35eSSatish Balay   })
3006edef35eSSatish Balay 
3016edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
3026edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
3036edef35eSSatish Balay     volatile unsigned int __addr;                                 \
3046edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
3056edef35eSSatish Balay                      /* %EAX = guest_NRADDR */                    \
3066edef35eSSatish Balay                      "xchgl %%ecx,%%ecx"                          \
3076edef35eSSatish Balay                      : "=a" (__addr)                              \
3086edef35eSSatish Balay                      :                                            \
3096edef35eSSatish Balay                      : "cc", "memory"                             \
3106edef35eSSatish Balay                     );                                            \
3116edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                   \
3126edef35eSSatish Balay   }
3136edef35eSSatish Balay 
3146edef35eSSatish Balay #define VALGRIND_CALL_NOREDIR_EAX                                 \
3156edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
3166edef35eSSatish Balay                      /* call-noredir *%EAX */                     \
3176edef35eSSatish Balay                      "xchgl %%edx,%%edx\n\t"
3186edef35eSSatish Balay 
3196edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
3206edef35eSSatish Balay  do {                                                            \
3216edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
3226edef35eSSatish Balay                      "xchgl %%edi,%%edi\n\t"                     \
3236edef35eSSatish Balay                      : : : "cc", "memory"                        \
3246edef35eSSatish Balay                     );                                           \
3256edef35eSSatish Balay  } while (0)
3266edef35eSSatish Balay 
3276edef35eSSatish Balay #endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__)
3286edef35eSSatish Balay           || PLAT_x86_solaris */
3296edef35eSSatish Balay 
3306edef35eSSatish Balay /* ------------------------- x86-Win32 ------------------------- */
3316edef35eSSatish Balay 
3326edef35eSSatish Balay #if defined(PLAT_x86_win32) && !defined(__GNUC__)
3336edef35eSSatish Balay 
3346edef35eSSatish Balay typedef
3356edef35eSSatish Balay    struct {
3366edef35eSSatish Balay       unsigned int nraddr; /* where's the code? */
3376edef35eSSatish Balay    }
3386edef35eSSatish Balay    OrigFn;
3396edef35eSSatish Balay 
3406edef35eSSatish Balay #if defined(_MSC_VER)
3416edef35eSSatish Balay 
3426edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
3436edef35eSSatish Balay                      __asm rol edi, 3  __asm rol edi, 13          \
3446edef35eSSatish Balay                      __asm rol edi, 29 __asm rol edi, 19
3456edef35eSSatish Balay 
3466edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
3476edef35eSSatish Balay         _zzq_default, _zzq_request,                               \
3486edef35eSSatish Balay         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
3496edef35eSSatish Balay     valgrind_do_client_request_expr((uintptr_t)(_zzq_default),    \
3506edef35eSSatish Balay         (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1),        \
3516edef35eSSatish Balay         (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3),           \
3526edef35eSSatish Balay         (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5))
3536edef35eSSatish Balay 
3546edef35eSSatish Balay static __inline uintptr_t
3556edef35eSSatish Balay valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request,
3566edef35eSSatish Balay                                 uintptr_t _zzq_arg1, uintptr_t _zzq_arg2,
3576edef35eSSatish Balay                                 uintptr_t _zzq_arg3, uintptr_t _zzq_arg4,
3586edef35eSSatish Balay                                 uintptr_t _zzq_arg5)
3596edef35eSSatish Balay {
3606edef35eSSatish Balay     volatile uintptr_t _zzq_args[6];
3616edef35eSSatish Balay     volatile unsigned int _zzq_result;
3626edef35eSSatish Balay     _zzq_args[0] = (uintptr_t)(_zzq_request);
3636edef35eSSatish Balay     _zzq_args[1] = (uintptr_t)(_zzq_arg1);
3646edef35eSSatish Balay     _zzq_args[2] = (uintptr_t)(_zzq_arg2);
3656edef35eSSatish Balay     _zzq_args[3] = (uintptr_t)(_zzq_arg3);
3666edef35eSSatish Balay     _zzq_args[4] = (uintptr_t)(_zzq_arg4);
3676edef35eSSatish Balay     _zzq_args[5] = (uintptr_t)(_zzq_arg5);
3686edef35eSSatish Balay     __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default
3696edef35eSSatish Balay             __SPECIAL_INSTRUCTION_PREAMBLE
3706edef35eSSatish Balay             /* %EDX = client_request ( %EAX ) */
3716edef35eSSatish Balay             __asm xchg ebx,ebx
3726edef35eSSatish Balay             __asm mov _zzq_result, edx
3736edef35eSSatish Balay     }
3746edef35eSSatish Balay     return _zzq_result;
3756edef35eSSatish Balay }
3766edef35eSSatish Balay 
3776edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
3786edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
3796edef35eSSatish Balay     volatile unsigned int __addr;                                 \
3806edef35eSSatish Balay     __asm { __SPECIAL_INSTRUCTION_PREAMBLE                        \
3816edef35eSSatish Balay             /* %EAX = guest_NRADDR */                             \
3826edef35eSSatish Balay             __asm xchg ecx,ecx                                    \
3836edef35eSSatish Balay             __asm mov __addr, eax                                 \
3846edef35eSSatish Balay     }                                                             \
3856edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                   \
3866edef35eSSatish Balay   }
3876edef35eSSatish Balay 
3886edef35eSSatish Balay #define VALGRIND_CALL_NOREDIR_EAX ERROR
3896edef35eSSatish Balay 
3906edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
3916edef35eSSatish Balay  do {                                                            \
3926edef35eSSatish Balay     __asm { __SPECIAL_INSTRUCTION_PREAMBLE                       \
3936edef35eSSatish Balay             __asm xchg edi,edi                                   \
3946edef35eSSatish Balay     }                                                            \
3956edef35eSSatish Balay  } while (0)
3966edef35eSSatish Balay 
3976edef35eSSatish Balay #else
3986edef35eSSatish Balay #error Unsupported compiler.
3996edef35eSSatish Balay #endif
4006edef35eSSatish Balay 
4016edef35eSSatish Balay #endif /* PLAT_x86_win32 */
4026edef35eSSatish Balay 
4036edef35eSSatish Balay /* ----------------- amd64-{linux,darwin,solaris} --------------- */
4046edef35eSSatish Balay 
4056edef35eSSatish Balay #if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin) \
4066edef35eSSatish Balay     ||  defined(PLAT_amd64_solaris) \
407cea3dcb8SSatish Balay     ||  defined(PLAT_amd64_freebsd) \
4086edef35eSSatish Balay     ||  (defined(PLAT_amd64_win64) && defined(__GNUC__))
4096edef35eSSatish Balay 
4106edef35eSSatish Balay typedef
4116edef35eSSatish Balay    struct {
4126edef35eSSatish Balay       unsigned long int nraddr; /* where's the code? */
4136edef35eSSatish Balay    }
4146edef35eSSatish Balay    OrigFn;
4156edef35eSSatish Balay 
4166edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
4176edef35eSSatish Balay                      "rolq $3,  %%rdi ; rolq $13, %%rdi\n\t"      \
4186edef35eSSatish Balay                      "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
4196edef35eSSatish Balay 
4206edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
4216edef35eSSatish Balay         _zzq_default, _zzq_request,                               \
4226edef35eSSatish Balay         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
4236edef35eSSatish Balay     __extension__                                                 \
4246edef35eSSatish Balay     ({ volatile unsigned long int _zzq_args[6];                   \
4256edef35eSSatish Balay     volatile unsigned long int _zzq_result;                       \
4266edef35eSSatish Balay     _zzq_args[0] = (unsigned long int)(_zzq_request);             \
4276edef35eSSatish Balay     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
4286edef35eSSatish Balay     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
4296edef35eSSatish Balay     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
4306edef35eSSatish Balay     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
4316edef35eSSatish Balay     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
4326edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
4336edef35eSSatish Balay                      /* %RDX = client_request ( %RAX ) */         \
4346edef35eSSatish Balay                      "xchgq %%rbx,%%rbx"                          \
4356edef35eSSatish Balay                      : "=d" (_zzq_result)                         \
4366edef35eSSatish Balay                      : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
4376edef35eSSatish Balay                      : "cc", "memory"                             \
4386edef35eSSatish Balay                     );                                            \
4396edef35eSSatish Balay     _zzq_result;                                                  \
4406edef35eSSatish Balay     })
4416edef35eSSatish Balay 
4426edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
4436edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
4446edef35eSSatish Balay     volatile unsigned long int __addr;                            \
4456edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
4466edef35eSSatish Balay                      /* %RAX = guest_NRADDR */                    \
4476edef35eSSatish Balay                      "xchgq %%rcx,%%rcx"                          \
4486edef35eSSatish Balay                      : "=a" (__addr)                              \
4496edef35eSSatish Balay                      :                                            \
4506edef35eSSatish Balay                      : "cc", "memory"                             \
4516edef35eSSatish Balay                     );                                            \
4526edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                   \
4536edef35eSSatish Balay   }
4546edef35eSSatish Balay 
4556edef35eSSatish Balay #define VALGRIND_CALL_NOREDIR_RAX                                 \
4566edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
4576edef35eSSatish Balay                      /* call-noredir *%RAX */                     \
4586edef35eSSatish Balay                      "xchgq %%rdx,%%rdx\n\t"
4596edef35eSSatish Balay 
4606edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
4616edef35eSSatish Balay  do {                                                            \
4626edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
4636edef35eSSatish Balay                      "xchgq %%rdi,%%rdi\n\t"                     \
4646edef35eSSatish Balay                      : : : "cc", "memory"                        \
4656edef35eSSatish Balay                     );                                           \
4666edef35eSSatish Balay  } while (0)
4676edef35eSSatish Balay 
4686edef35eSSatish Balay #endif /* PLAT_amd64_linux || PLAT_amd64_darwin || PLAT_amd64_solaris */
4696edef35eSSatish Balay 
4706edef35eSSatish Balay /* ------------------------- amd64-Win64 ------------------------- */
4716edef35eSSatish Balay 
4726edef35eSSatish Balay #if defined(PLAT_amd64_win64) && !defined(__GNUC__)
4736edef35eSSatish Balay 
4746edef35eSSatish Balay #error Unsupported compiler.
4756edef35eSSatish Balay 
4766edef35eSSatish Balay #endif /* PLAT_amd64_win64 */
4776edef35eSSatish Balay 
4786edef35eSSatish Balay /* ------------------------ ppc32-linux ------------------------ */
4796edef35eSSatish Balay 
4806edef35eSSatish Balay #if defined(PLAT_ppc32_linux)
4816edef35eSSatish Balay 
4826edef35eSSatish Balay typedef
4836edef35eSSatish Balay    struct {
4846edef35eSSatish Balay       unsigned int nraddr; /* where's the code? */
4856edef35eSSatish Balay    }
4866edef35eSSatish Balay    OrigFn;
4876edef35eSSatish Balay 
4886edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
4896edef35eSSatish Balay                     "rlwinm 0,0,3,0,31  ; rlwinm 0,0,13,0,31\n\t" \
4906edef35eSSatish Balay                     "rlwinm 0,0,29,0,31 ; rlwinm 0,0,19,0,31\n\t"
4916edef35eSSatish Balay 
4926edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
4936edef35eSSatish Balay         _zzq_default, _zzq_request,                               \
4946edef35eSSatish Balay         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
4956edef35eSSatish Balay                                                                   \
4966edef35eSSatish Balay     __extension__                                                 \
4976edef35eSSatish Balay   ({         unsigned int  _zzq_args[6];                          \
4986edef35eSSatish Balay              unsigned int  _zzq_result;                           \
4996edef35eSSatish Balay              unsigned int* _zzq_ptr;                              \
5006edef35eSSatish Balay     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
5016edef35eSSatish Balay     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
5026edef35eSSatish Balay     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
5036edef35eSSatish Balay     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
5046edef35eSSatish Balay     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
5056edef35eSSatish Balay     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
5066edef35eSSatish Balay     _zzq_ptr = _zzq_args;                                         \
5076edef35eSSatish Balay     __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
5086edef35eSSatish Balay                      "mr 4,%2\n\t" /*ptr*/                        \
5096edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
5106edef35eSSatish Balay                      /* %R3 = client_request ( %R4 ) */           \
5116edef35eSSatish Balay                      "or 1,1,1\n\t"                               \
5126edef35eSSatish Balay                      "mr %0,3"     /*result*/                     \
5136edef35eSSatish Balay                      : "=b" (_zzq_result)                         \
5146edef35eSSatish Balay                      : "b" (_zzq_default), "b" (_zzq_ptr)         \
5156edef35eSSatish Balay                      : "cc", "memory", "r3", "r4");               \
5166edef35eSSatish Balay     _zzq_result;                                                  \
5176edef35eSSatish Balay     })
5186edef35eSSatish Balay 
5196edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
5206edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
5216edef35eSSatish Balay     unsigned int __addr;                                          \
5226edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
5236edef35eSSatish Balay                      /* %R3 = guest_NRADDR */                     \
5246edef35eSSatish Balay                      "or 2,2,2\n\t"                               \
5256edef35eSSatish Balay                      "mr %0,3"                                    \
5266edef35eSSatish Balay                      : "=b" (__addr)                              \
5276edef35eSSatish Balay                      :                                            \
5286edef35eSSatish Balay                      : "cc", "memory", "r3"                       \
5296edef35eSSatish Balay                     );                                            \
5306edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                   \
5316edef35eSSatish Balay   }
5326edef35eSSatish Balay 
5336edef35eSSatish Balay #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
5346edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
5356edef35eSSatish Balay                      /* branch-and-link-to-noredir *%R11 */       \
5366edef35eSSatish Balay                      "or 3,3,3\n\t"
5376edef35eSSatish Balay 
5386edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
5396edef35eSSatish Balay  do {                                                            \
5406edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
5416edef35eSSatish Balay                      "or 5,5,5\n\t"                              \
5426edef35eSSatish Balay                     );                                           \
5436edef35eSSatish Balay  } while (0)
5446edef35eSSatish Balay 
5456edef35eSSatish Balay #endif /* PLAT_ppc32_linux */
5466edef35eSSatish Balay 
5476edef35eSSatish Balay /* ------------------------ ppc64-linux ------------------------ */
5486edef35eSSatish Balay 
5496edef35eSSatish Balay #if defined(PLAT_ppc64be_linux)
5506edef35eSSatish Balay 
5516edef35eSSatish Balay typedef
5526edef35eSSatish Balay    struct {
5536edef35eSSatish Balay       unsigned long int nraddr; /* where's the code? */
5546edef35eSSatish Balay       unsigned long int r2;  /* what tocptr do we need? */
5556edef35eSSatish Balay    }
5566edef35eSSatish Balay    OrigFn;
5576edef35eSSatish Balay 
5586edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
5596edef35eSSatish Balay                      "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
5606edef35eSSatish Balay                      "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
5616edef35eSSatish Balay 
5626edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
5636edef35eSSatish Balay         _zzq_default, _zzq_request,                               \
5646edef35eSSatish Balay         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
5656edef35eSSatish Balay                                                                   \
5666edef35eSSatish Balay   __extension__                                                   \
5676edef35eSSatish Balay   ({         unsigned long int  _zzq_args[6];                     \
5686edef35eSSatish Balay              unsigned long int  _zzq_result;                      \
5696edef35eSSatish Balay              unsigned long int* _zzq_ptr;                         \
5706edef35eSSatish Balay     _zzq_args[0] = (unsigned long int)(_zzq_request);             \
5716edef35eSSatish Balay     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
5726edef35eSSatish Balay     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
5736edef35eSSatish Balay     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
5746edef35eSSatish Balay     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
5756edef35eSSatish Balay     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
5766edef35eSSatish Balay     _zzq_ptr = _zzq_args;                                         \
5776edef35eSSatish Balay     __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
5786edef35eSSatish Balay                      "mr 4,%2\n\t" /*ptr*/                        \
5796edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
5806edef35eSSatish Balay                      /* %R3 = client_request ( %R4 ) */           \
5816edef35eSSatish Balay                      "or 1,1,1\n\t"                               \
5826edef35eSSatish Balay                      "mr %0,3"     /*result*/                     \
5836edef35eSSatish Balay                      : "=b" (_zzq_result)                         \
5846edef35eSSatish Balay                      : "b" (_zzq_default), "b" (_zzq_ptr)         \
5856edef35eSSatish Balay                      : "cc", "memory", "r3", "r4");               \
5866edef35eSSatish Balay     _zzq_result;                                                  \
5876edef35eSSatish Balay   })
5886edef35eSSatish Balay 
5896edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
5906edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
5916edef35eSSatish Balay     unsigned long int __addr;                                     \
5926edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
5936edef35eSSatish Balay                      /* %R3 = guest_NRADDR */                     \
5946edef35eSSatish Balay                      "or 2,2,2\n\t"                               \
5956edef35eSSatish Balay                      "mr %0,3"                                    \
5966edef35eSSatish Balay                      : "=b" (__addr)                              \
5976edef35eSSatish Balay                      :                                            \
5986edef35eSSatish Balay                      : "cc", "memory", "r3"                       \
5996edef35eSSatish Balay                     );                                            \
6006edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                   \
6016edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
6026edef35eSSatish Balay                      /* %R3 = guest_NRADDR_GPR2 */                \
6036edef35eSSatish Balay                      "or 4,4,4\n\t"                               \
6046edef35eSSatish Balay                      "mr %0,3"                                    \
6056edef35eSSatish Balay                      : "=b" (__addr)                              \
6066edef35eSSatish Balay                      :                                            \
6076edef35eSSatish Balay                      : "cc", "memory", "r3"                       \
6086edef35eSSatish Balay                     );                                            \
6096edef35eSSatish Balay     _zzq_orig->r2 = __addr;                                       \
6106edef35eSSatish Balay   }
6116edef35eSSatish Balay 
6126edef35eSSatish Balay #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
6136edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
6146edef35eSSatish Balay                      /* branch-and-link-to-noredir *%R11 */       \
6156edef35eSSatish Balay                      "or 3,3,3\n\t"
6166edef35eSSatish Balay 
6176edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
6186edef35eSSatish Balay  do {                                                            \
6196edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
6206edef35eSSatish Balay                      "or 5,5,5\n\t"                              \
6216edef35eSSatish Balay                     );                                           \
6226edef35eSSatish Balay  } while (0)
6236edef35eSSatish Balay 
6246edef35eSSatish Balay #endif /* PLAT_ppc64be_linux */
6256edef35eSSatish Balay 
6266edef35eSSatish Balay #if defined(PLAT_ppc64le_linux)
6276edef35eSSatish Balay 
6286edef35eSSatish Balay typedef
6296edef35eSSatish Balay    struct {
6306edef35eSSatish Balay       unsigned long int nraddr; /* where's the code? */
6316edef35eSSatish Balay       unsigned long int r2;     /* what tocptr do we need? */
6326edef35eSSatish Balay    }
6336edef35eSSatish Balay    OrigFn;
6346edef35eSSatish Balay 
6356edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
6366edef35eSSatish Balay                      "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
6376edef35eSSatish Balay                      "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
6386edef35eSSatish Balay 
6396edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
6406edef35eSSatish Balay         _zzq_default, _zzq_request,                               \
6416edef35eSSatish Balay         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
6426edef35eSSatish Balay                                                                   \
6436edef35eSSatish Balay   __extension__                                                   \
6446edef35eSSatish Balay   ({         unsigned long int  _zzq_args[6];                     \
6456edef35eSSatish Balay              unsigned long int  _zzq_result;                      \
6466edef35eSSatish Balay              unsigned long int* _zzq_ptr;                         \
6476edef35eSSatish Balay     _zzq_args[0] = (unsigned long int)(_zzq_request);             \
6486edef35eSSatish Balay     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
6496edef35eSSatish Balay     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
6506edef35eSSatish Balay     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
6516edef35eSSatish Balay     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
6526edef35eSSatish Balay     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
6536edef35eSSatish Balay     _zzq_ptr = _zzq_args;                                         \
6546edef35eSSatish Balay     __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
6556edef35eSSatish Balay                      "mr 4,%2\n\t" /*ptr*/                        \
6566edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
6576edef35eSSatish Balay                      /* %R3 = client_request ( %R4 ) */           \
6586edef35eSSatish Balay                      "or 1,1,1\n\t"                               \
6596edef35eSSatish Balay                      "mr %0,3"     /*result*/                     \
6606edef35eSSatish Balay                      : "=b" (_zzq_result)                         \
6616edef35eSSatish Balay                      : "b" (_zzq_default), "b" (_zzq_ptr)         \
6626edef35eSSatish Balay                      : "cc", "memory", "r3", "r4");               \
6636edef35eSSatish Balay     _zzq_result;                                                  \
6646edef35eSSatish Balay   })
6656edef35eSSatish Balay 
6666edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
6676edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
6686edef35eSSatish Balay     unsigned long int __addr;                                     \
6696edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
6706edef35eSSatish Balay                      /* %R3 = guest_NRADDR */                     \
6716edef35eSSatish Balay                      "or 2,2,2\n\t"                               \
6726edef35eSSatish Balay                      "mr %0,3"                                    \
6736edef35eSSatish Balay                      : "=b" (__addr)                              \
6746edef35eSSatish Balay                      :                                            \
6756edef35eSSatish Balay                      : "cc", "memory", "r3"                       \
6766edef35eSSatish Balay                     );                                            \
6776edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                   \
6786edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
6796edef35eSSatish Balay                      /* %R3 = guest_NRADDR_GPR2 */                \
6806edef35eSSatish Balay                      "or 4,4,4\n\t"                               \
6816edef35eSSatish Balay                      "mr %0,3"                                    \
6826edef35eSSatish Balay                      : "=b" (__addr)                              \
6836edef35eSSatish Balay                      :                                            \
6846edef35eSSatish Balay                      : "cc", "memory", "r3"                       \
6856edef35eSSatish Balay                     );                                            \
6866edef35eSSatish Balay     _zzq_orig->r2 = __addr;                                       \
6876edef35eSSatish Balay   }
6886edef35eSSatish Balay 
6896edef35eSSatish Balay #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                   \
6906edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
6916edef35eSSatish Balay                      /* branch-and-link-to-noredir *%R12 */       \
6926edef35eSSatish Balay                      "or 3,3,3\n\t"
6936edef35eSSatish Balay 
6946edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
6956edef35eSSatish Balay  do {                                                            \
6966edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
6976edef35eSSatish Balay                      "or 5,5,5\n\t"                              \
6986edef35eSSatish Balay                     );                                           \
6996edef35eSSatish Balay  } while (0)
7006edef35eSSatish Balay 
7016edef35eSSatish Balay #endif /* PLAT_ppc64le_linux */
7026edef35eSSatish Balay 
7036edef35eSSatish Balay /* ------------------------- arm-linux ------------------------- */
7046edef35eSSatish Balay 
7056edef35eSSatish Balay #if defined(PLAT_arm_linux)
7066edef35eSSatish Balay 
7076edef35eSSatish Balay typedef
7086edef35eSSatish Balay    struct {
7096edef35eSSatish Balay       unsigned int nraddr; /* where's the code? */
7106edef35eSSatish Balay    }
7116edef35eSSatish Balay    OrigFn;
7126edef35eSSatish Balay 
7136edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
7146edef35eSSatish Balay             "mov r12, r12, ror #3  ; mov r12, r12, ror #13 \n\t"  \
7156edef35eSSatish Balay             "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
7166edef35eSSatish Balay 
7176edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
7186edef35eSSatish Balay         _zzq_default, _zzq_request,                               \
7196edef35eSSatish Balay         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
7206edef35eSSatish Balay                                                                   \
7216edef35eSSatish Balay   __extension__                                                   \
7226edef35eSSatish Balay   ({volatile unsigned int  _zzq_args[6];                          \
7236edef35eSSatish Balay     volatile unsigned int  _zzq_result;                           \
7246edef35eSSatish Balay     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
7256edef35eSSatish Balay     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
7266edef35eSSatish Balay     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
7276edef35eSSatish Balay     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
7286edef35eSSatish Balay     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
7296edef35eSSatish Balay     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
7306edef35eSSatish Balay     __asm__ volatile("mov r3, %1\n\t" /*default*/                 \
7316edef35eSSatish Balay                      "mov r4, %2\n\t" /*ptr*/                     \
7326edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
7336edef35eSSatish Balay                      /* R3 = client_request ( R4 ) */             \
7346edef35eSSatish Balay                      "orr r10, r10, r10\n\t"                      \
7356edef35eSSatish Balay                      "mov %0, r3"     /*result*/                  \
7366edef35eSSatish Balay                      : "=r" (_zzq_result)                         \
7376edef35eSSatish Balay                      : "r" (_zzq_default), "r" (&_zzq_args[0])    \
7386edef35eSSatish Balay                      : "cc","memory", "r3", "r4");                \
7396edef35eSSatish Balay     _zzq_result;                                                  \
7406edef35eSSatish Balay   })
7416edef35eSSatish Balay 
7426edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
7436edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
7446edef35eSSatish Balay     unsigned int __addr;                                          \
7456edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
7466edef35eSSatish Balay                      /* R3 = guest_NRADDR */                      \
7476edef35eSSatish Balay                      "orr r11, r11, r11\n\t"                      \
7486edef35eSSatish Balay                      "mov %0, r3"                                 \
7496edef35eSSatish Balay                      : "=r" (__addr)                              \
7506edef35eSSatish Balay                      :                                            \
7516edef35eSSatish Balay                      : "cc", "memory", "r3"                       \
7526edef35eSSatish Balay                     );                                            \
7536edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                   \
7546edef35eSSatish Balay   }
7556edef35eSSatish Balay 
7566edef35eSSatish Balay #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                    \
7576edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
7586edef35eSSatish Balay                      /* branch-and-link-to-noredir *%R4 */        \
7596edef35eSSatish Balay                      "orr r12, r12, r12\n\t"
7606edef35eSSatish Balay 
7616edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
7626edef35eSSatish Balay  do {                                                            \
7636edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
7646edef35eSSatish Balay                      "orr r9, r9, r9\n\t"                        \
7656edef35eSSatish Balay                      : : : "cc", "memory"                        \
7666edef35eSSatish Balay                     );                                           \
7676edef35eSSatish Balay  } while (0)
7686edef35eSSatish Balay 
7696edef35eSSatish Balay #endif /* PLAT_arm_linux */
7706edef35eSSatish Balay 
7716edef35eSSatish Balay /* ------------------------ arm64-linux ------------------------- */
7726edef35eSSatish Balay 
7736edef35eSSatish Balay #if defined(PLAT_arm64_linux)
7746edef35eSSatish Balay 
7756edef35eSSatish Balay typedef
7766edef35eSSatish Balay    struct {
7776edef35eSSatish Balay       unsigned long int nraddr; /* where's the code? */
7786edef35eSSatish Balay    }
7796edef35eSSatish Balay    OrigFn;
7806edef35eSSatish Balay 
7816edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
7826edef35eSSatish Balay             "ror x12, x12, #3  ;  ror x12, x12, #13 \n\t"         \
7836edef35eSSatish Balay             "ror x12, x12, #51 ;  ror x12, x12, #61 \n\t"
7846edef35eSSatish Balay 
7856edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
7866edef35eSSatish Balay         _zzq_default, _zzq_request,                               \
7876edef35eSSatish Balay         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
7886edef35eSSatish Balay                                                                   \
7896edef35eSSatish Balay   __extension__                                                   \
7906edef35eSSatish Balay   ({volatile unsigned long int  _zzq_args[6];                     \
7916edef35eSSatish Balay     volatile unsigned long int  _zzq_result;                      \
7926edef35eSSatish Balay     _zzq_args[0] = (unsigned long int)(_zzq_request);             \
7936edef35eSSatish Balay     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
7946edef35eSSatish Balay     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
7956edef35eSSatish Balay     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
7966edef35eSSatish Balay     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
7976edef35eSSatish Balay     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
7986edef35eSSatish Balay     __asm__ volatile("mov x3, %1\n\t" /*default*/                 \
7996edef35eSSatish Balay                      "mov x4, %2\n\t" /*ptr*/                     \
8006edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
8016edef35eSSatish Balay                      /* X3 = client_request ( X4 ) */             \
8026edef35eSSatish Balay                      "orr x10, x10, x10\n\t"                      \
8036edef35eSSatish Balay                      "mov %0, x3"     /*result*/                  \
8046edef35eSSatish Balay                      : "=r" (_zzq_result)                         \
8056edef35eSSatish Balay                      : "r" ((unsigned long int)(_zzq_default)),   \
8066edef35eSSatish Balay                        "r" (&_zzq_args[0])                        \
8076edef35eSSatish Balay                      : "cc","memory", "x3", "x4");                \
8086edef35eSSatish Balay     _zzq_result;                                                  \
8096edef35eSSatish Balay   })
8106edef35eSSatish Balay 
8116edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
8126edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
8136edef35eSSatish Balay     unsigned long int __addr;                                     \
8146edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
8156edef35eSSatish Balay                      /* X3 = guest_NRADDR */                      \
8166edef35eSSatish Balay                      "orr x11, x11, x11\n\t"                      \
8176edef35eSSatish Balay                      "mov %0, x3"                                 \
8186edef35eSSatish Balay                      : "=r" (__addr)                              \
8196edef35eSSatish Balay                      :                                            \
8206edef35eSSatish Balay                      : "cc", "memory", "x3"                       \
8216edef35eSSatish Balay                     );                                            \
8226edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                   \
8236edef35eSSatish Balay   }
8246edef35eSSatish Balay 
8256edef35eSSatish Balay #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                    \
8266edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
8276edef35eSSatish Balay                      /* branch-and-link-to-noredir X8 */          \
8286edef35eSSatish Balay                      "orr x12, x12, x12\n\t"
8296edef35eSSatish Balay 
8306edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
8316edef35eSSatish Balay  do {                                                            \
8326edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
8336edef35eSSatish Balay                      "orr x9, x9, x9\n\t"                        \
8346edef35eSSatish Balay                      : : : "cc", "memory"                        \
8356edef35eSSatish Balay                     );                                           \
8366edef35eSSatish Balay  } while (0)
8376edef35eSSatish Balay 
8386edef35eSSatish Balay #endif /* PLAT_arm64_linux */
8396edef35eSSatish Balay 
8406edef35eSSatish Balay /* ------------------------ s390x-linux ------------------------ */
8416edef35eSSatish Balay 
8426edef35eSSatish Balay #if defined(PLAT_s390x_linux)
8436edef35eSSatish Balay 
8446edef35eSSatish Balay typedef
8456edef35eSSatish Balay   struct {
8466edef35eSSatish Balay      unsigned long int nraddr; /* where's the code? */
8476edef35eSSatish Balay   }
8486edef35eSSatish Balay   OrigFn;
8496edef35eSSatish Balay 
8506edef35eSSatish Balay /* __SPECIAL_INSTRUCTION_PREAMBLE will be used to identify Valgrind specific
8516edef35eSSatish Balay  * code. This detection is implemented in platform specific toIR.c
8526edef35eSSatish Balay  * (e.g. VEX/priv/guest_s390_decoder.c).
8536edef35eSSatish Balay  */
8546edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                           \
8556edef35eSSatish Balay                      "lr 15,15\n\t"                              \
8566edef35eSSatish Balay                      "lr 1,1\n\t"                                \
8576edef35eSSatish Balay                      "lr 2,2\n\t"                                \
8586edef35eSSatish Balay                      "lr 3,3\n\t"
8596edef35eSSatish Balay 
8606edef35eSSatish Balay #define __CLIENT_REQUEST_CODE "lr 2,2\n\t"
8616edef35eSSatish Balay #define __GET_NR_CONTEXT_CODE "lr 3,3\n\t"
8626edef35eSSatish Balay #define __CALL_NO_REDIR_CODE  "lr 4,4\n\t"
8636edef35eSSatish Balay #define __VEX_INJECT_IR_CODE  "lr 5,5\n\t"
8646edef35eSSatish Balay 
8656edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                         \
8666edef35eSSatish Balay        _zzq_default, _zzq_request,                               \
8676edef35eSSatish Balay        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
8686edef35eSSatish Balay   __extension__                                                  \
8696edef35eSSatish Balay  ({volatile unsigned long int _zzq_args[6];                      \
8706edef35eSSatish Balay    volatile unsigned long int _zzq_result;                       \
8716edef35eSSatish Balay    _zzq_args[0] = (unsigned long int)(_zzq_request);             \
8726edef35eSSatish Balay    _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
8736edef35eSSatish Balay    _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
8746edef35eSSatish Balay    _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
8756edef35eSSatish Balay    _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
8766edef35eSSatish Balay    _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
8776edef35eSSatish Balay    __asm__ volatile(/* r2 = args */                              \
8786edef35eSSatish Balay                     "lgr 2,%1\n\t"                               \
8796edef35eSSatish Balay                     /* r3 = default */                           \
8806edef35eSSatish Balay                     "lgr 3,%2\n\t"                               \
8816edef35eSSatish Balay                     __SPECIAL_INSTRUCTION_PREAMBLE               \
8826edef35eSSatish Balay                     __CLIENT_REQUEST_CODE                        \
8836edef35eSSatish Balay                     /* results = r3 */                           \
8846edef35eSSatish Balay                     "lgr %0, 3\n\t"                              \
8856edef35eSSatish Balay                     : "=d" (_zzq_result)                         \
8866edef35eSSatish Balay                     : "a" (&_zzq_args[0]),                       \
8876edef35eSSatish Balay                       "0" ((unsigned long int)_zzq_default)      \
8886edef35eSSatish Balay                     : "cc", "2", "3", "memory"                   \
8896edef35eSSatish Balay                    );                                            \
8906edef35eSSatish Balay    _zzq_result;                                                  \
8916edef35eSSatish Balay  })
8926edef35eSSatish Balay 
8936edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                      \
8946edef35eSSatish Balay  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
8956edef35eSSatish Balay    volatile unsigned long int __addr;                            \
8966edef35eSSatish Balay    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
8976edef35eSSatish Balay                     __GET_NR_CONTEXT_CODE                        \
8986edef35eSSatish Balay                     "lgr %0, 3\n\t"                              \
8996edef35eSSatish Balay                     : "=a" (__addr)                              \
9006edef35eSSatish Balay                     :                                            \
9016edef35eSSatish Balay                     : "cc", "3", "memory"                        \
9026edef35eSSatish Balay                    );                                            \
9036edef35eSSatish Balay    _zzq_orig->nraddr = __addr;                                   \
9046edef35eSSatish Balay  }
9056edef35eSSatish Balay 
9066edef35eSSatish Balay #define VALGRIND_CALL_NOREDIR_R1                                 \
9076edef35eSSatish Balay                     __SPECIAL_INSTRUCTION_PREAMBLE               \
9086edef35eSSatish Balay                     __CALL_NO_REDIR_CODE
9096edef35eSSatish Balay 
9106edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
9116edef35eSSatish Balay  do {                                                            \
9126edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
9136edef35eSSatish Balay                      __VEX_INJECT_IR_CODE);                      \
9146edef35eSSatish Balay  } while (0)
9156edef35eSSatish Balay 
9166edef35eSSatish Balay #endif /* PLAT_s390x_linux */
9176edef35eSSatish Balay 
9186edef35eSSatish Balay /* ------------------------- mips32-linux ---------------- */
9196edef35eSSatish Balay 
9206edef35eSSatish Balay #if defined(PLAT_mips32_linux)
9216edef35eSSatish Balay 
9226edef35eSSatish Balay typedef
9236edef35eSSatish Balay    struct {
9246edef35eSSatish Balay       unsigned int nraddr; /* where's the code? */
9256edef35eSSatish Balay    }
9266edef35eSSatish Balay    OrigFn;
9276edef35eSSatish Balay 
9286edef35eSSatish Balay /* .word  0x342
9296edef35eSSatish Balay  * .word  0x742
9306edef35eSSatish Balay  * .word  0xC2
9316edef35eSSatish Balay  * .word  0x4C2*/
9326edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE          \
9336edef35eSSatish Balay                      "srl $0, $0, 13\n\t"       \
9346edef35eSSatish Balay                      "srl $0, $0, 29\n\t"       \
9356edef35eSSatish Balay                      "srl $0, $0, 3\n\t"        \
9366edef35eSSatish Balay                      "srl $0, $0, 19\n\t"
9376edef35eSSatish Balay 
9386edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
9396edef35eSSatish Balay        _zzq_default, _zzq_request,                                \
9406edef35eSSatish Balay        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)     \
9416edef35eSSatish Balay   __extension__                                                   \
9426edef35eSSatish Balay   ({ volatile unsigned int _zzq_args[6];                          \
9436edef35eSSatish Balay     volatile unsigned int _zzq_result;                            \
9446edef35eSSatish Balay     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
9456edef35eSSatish Balay     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
9466edef35eSSatish Balay     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
9476edef35eSSatish Balay     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
9486edef35eSSatish Balay     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
9496edef35eSSatish Balay     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
9506edef35eSSatish Balay         __asm__ volatile("move $11, %1\n\t" /*default*/           \
9516edef35eSSatish Balay                      "move $12, %2\n\t" /*ptr*/                   \
9526edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
9536edef35eSSatish Balay                      /* T3 = client_request ( T4 ) */             \
9546edef35eSSatish Balay                      "or $13, $13, $13\n\t"                       \
9556edef35eSSatish Balay                      "move %0, $11\n\t"     /*result*/            \
9566edef35eSSatish Balay                      : "=r" (_zzq_result)                         \
9576edef35eSSatish Balay                      : "r" (_zzq_default), "r" (&_zzq_args[0])    \
9586edef35eSSatish Balay                      : "$11", "$12", "memory");                   \
9596edef35eSSatish Balay     _zzq_result;                                                  \
9606edef35eSSatish Balay   })
9616edef35eSSatish Balay 
9626edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
9636edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
9646edef35eSSatish Balay     volatile unsigned int __addr;                                 \
9656edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
9666edef35eSSatish Balay                      /* %t9 = guest_NRADDR */                     \
9676edef35eSSatish Balay                      "or $14, $14, $14\n\t"                       \
9686edef35eSSatish Balay                      "move %0, $11"     /*result*/                \
9696edef35eSSatish Balay                      : "=r" (__addr)                              \
9706edef35eSSatish Balay                      :                                            \
9716edef35eSSatish Balay                      : "$11"                                      \
9726edef35eSSatish Balay                     );                                            \
9736edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                   \
9746edef35eSSatish Balay   }
9756edef35eSSatish Balay 
9766edef35eSSatish Balay #define VALGRIND_CALL_NOREDIR_T9                                 \
9776edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE              \
9786edef35eSSatish Balay                      /* call-noredir *%t9 */                     \
9796edef35eSSatish Balay                      "or $15, $15, $15\n\t"
9806edef35eSSatish Balay 
9816edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                 \
9826edef35eSSatish Balay  do {                                                            \
9836edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
9846edef35eSSatish Balay                      "or $11, $11, $11\n\t"                      \
9856edef35eSSatish Balay                     );                                           \
9866edef35eSSatish Balay  } while (0)
9876edef35eSSatish Balay 
9886edef35eSSatish Balay 
9896edef35eSSatish Balay #endif /* PLAT_mips32_linux */
9906edef35eSSatish Balay 
9916edef35eSSatish Balay /* ------------------------- mips64-linux ---------------- */
9926edef35eSSatish Balay 
9936edef35eSSatish Balay #if defined(PLAT_mips64_linux)
9946edef35eSSatish Balay 
9956edef35eSSatish Balay typedef
9966edef35eSSatish Balay    struct {
9976edef35eSSatish Balay       unsigned long nraddr; /* where's the code? */
9986edef35eSSatish Balay    }
9996edef35eSSatish Balay    OrigFn;
10006edef35eSSatish Balay 
10016edef35eSSatish Balay /* dsll $0,$0, 3
10026edef35eSSatish Balay  * dsll $0,$0, 13
10036edef35eSSatish Balay  * dsll $0,$0, 29
10046edef35eSSatish Balay  * dsll $0,$0, 19*/
10056edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE                              \
10066edef35eSSatish Balay                      "dsll $0,$0, 3 ; dsll $0,$0,13\n\t"            \
10076edef35eSSatish Balay                      "dsll $0,$0,29 ; dsll $0,$0,19\n\t"
10086edef35eSSatish Balay 
10096edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                            \
10106edef35eSSatish Balay        _zzq_default, _zzq_request,                                  \
10116edef35eSSatish Balay        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)       \
10126edef35eSSatish Balay   __extension__                                                     \
10136edef35eSSatish Balay   ({ volatile unsigned long int _zzq_args[6];                       \
10146edef35eSSatish Balay     volatile unsigned long int _zzq_result;                         \
10156edef35eSSatish Balay     _zzq_args[0] = (unsigned long int)(_zzq_request);               \
10166edef35eSSatish Balay     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                  \
10176edef35eSSatish Balay     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                  \
10186edef35eSSatish Balay     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                  \
10196edef35eSSatish Balay     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                  \
10206edef35eSSatish Balay     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                  \
10216edef35eSSatish Balay         __asm__ volatile("move $11, %1\n\t" /*default*/             \
10226edef35eSSatish Balay                          "move $12, %2\n\t" /*ptr*/                 \
10236edef35eSSatish Balay                          __SPECIAL_INSTRUCTION_PREAMBLE             \
10246edef35eSSatish Balay                          /* $11 = client_request ( $12 ) */         \
10256edef35eSSatish Balay                          "or $13, $13, $13\n\t"                     \
10266edef35eSSatish Balay                          "move %0, $11\n\t"     /*result*/          \
10276edef35eSSatish Balay                          : "=r" (_zzq_result)                       \
10286edef35eSSatish Balay                          : "r" (_zzq_default), "r" (&_zzq_args[0])  \
10296edef35eSSatish Balay                          : "$11", "$12", "memory");                 \
10306edef35eSSatish Balay     _zzq_result;                                                    \
10316edef35eSSatish Balay   })
10326edef35eSSatish Balay 
10336edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                         \
10346edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                     \
10356edef35eSSatish Balay     volatile unsigned long int __addr;                              \
10366edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
10376edef35eSSatish Balay                      /* $11 = guest_NRADDR */                       \
10386edef35eSSatish Balay                      "or $14, $14, $14\n\t"                         \
10396edef35eSSatish Balay                      "move %0, $11"     /*result*/                  \
10406edef35eSSatish Balay                      : "=r" (__addr)                                \
10416edef35eSSatish Balay                      :                                              \
10426edef35eSSatish Balay                      : "$11");                                      \
10436edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                     \
10446edef35eSSatish Balay   }
10456edef35eSSatish Balay 
10466edef35eSSatish Balay #define VALGRIND_CALL_NOREDIR_T9                                    \
10476edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE                 \
10486edef35eSSatish Balay                      /* call-noredir $25 */                         \
10496edef35eSSatish Balay                      "or $15, $15, $15\n\t"
10506edef35eSSatish Balay 
10516edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                    \
10526edef35eSSatish Balay  do {                                                               \
10536edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
10546edef35eSSatish Balay                      "or $11, $11, $11\n\t"                         \
10556edef35eSSatish Balay                     );                                              \
10566edef35eSSatish Balay  } while (0)
10576edef35eSSatish Balay 
10586edef35eSSatish Balay #endif /* PLAT_mips64_linux */
10596edef35eSSatish Balay 
10606edef35eSSatish Balay #if defined(PLAT_nanomips_linux)
10616edef35eSSatish Balay 
10626edef35eSSatish Balay typedef
10636edef35eSSatish Balay    struct {
10646edef35eSSatish Balay       unsigned int nraddr; /* where's the code? */
10656edef35eSSatish Balay    }
10666edef35eSSatish Balay    OrigFn;
10676edef35eSSatish Balay /*
10686edef35eSSatish Balay    8000 c04d  srl  zero, zero, 13
10696edef35eSSatish Balay    8000 c05d  srl  zero, zero, 29
10706edef35eSSatish Balay    8000 c043  srl  zero, zero,  3
10716edef35eSSatish Balay    8000 c053  srl  zero, zero, 19
10726edef35eSSatish Balay */
10736edef35eSSatish Balay 
10746edef35eSSatish Balay #define __SPECIAL_INSTRUCTION_PREAMBLE "srl[32] $zero, $zero, 13 \n\t" \
10756edef35eSSatish Balay                                        "srl[32] $zero, $zero, 29 \n\t" \
10766edef35eSSatish Balay                                        "srl[32] $zero, $zero, 3  \n\t" \
10776edef35eSSatish Balay                                        "srl[32] $zero, $zero, 19 \n\t"
10786edef35eSSatish Balay 
10796edef35eSSatish Balay #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
10806edef35eSSatish Balay        _zzq_default, _zzq_request,                                \
10816edef35eSSatish Balay        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)     \
10826edef35eSSatish Balay   __extension__                                                   \
10836edef35eSSatish Balay   ({ volatile unsigned int _zzq_args[6];                          \
10846edef35eSSatish Balay     volatile unsigned int _zzq_result;                            \
10856edef35eSSatish Balay     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
10866edef35eSSatish Balay     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
10876edef35eSSatish Balay     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
10886edef35eSSatish Balay     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
10896edef35eSSatish Balay     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
10906edef35eSSatish Balay     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
10916edef35eSSatish Balay     __asm__ volatile("move $a7, %1\n\t" /* default */             \
10926edef35eSSatish Balay                      "move $t0, %2\n\t" /* ptr */                 \
10936edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE               \
10946edef35eSSatish Balay                      /* $a7 = client_request( $t0 ) */            \
10956edef35eSSatish Balay                      "or[32] $t0, $t0, $t0\n\t"                   \
10966edef35eSSatish Balay                      "move %0, $a7\n\t"     /* result */          \
10976edef35eSSatish Balay                      : "=r" (_zzq_result)                         \
10986edef35eSSatish Balay                      : "r" (_zzq_default), "r" (&_zzq_args[0])    \
10996edef35eSSatish Balay                      : "$a7", "$t0", "memory");                   \
11006edef35eSSatish Balay     _zzq_result;                                                  \
11016edef35eSSatish Balay   })
11026edef35eSSatish Balay 
11036edef35eSSatish Balay #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                         \
11046edef35eSSatish Balay   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                     \
11056edef35eSSatish Balay     volatile unsigned long int __addr;                              \
11066edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
11076edef35eSSatish Balay                      /* $a7 = guest_NRADDR */                       \
11086edef35eSSatish Balay                      "or[32] $t1, $t1, $t1\n\t"                     \
11096edef35eSSatish Balay                      "move %0, $a7"     /*result*/                  \
11106edef35eSSatish Balay                      : "=r" (__addr)                                \
11116edef35eSSatish Balay                      :                                              \
11126edef35eSSatish Balay                      : "$a7");                                      \
11136edef35eSSatish Balay     _zzq_orig->nraddr = __addr;                                     \
11146edef35eSSatish Balay   }
11156edef35eSSatish Balay 
11166edef35eSSatish Balay #define VALGRIND_CALL_NOREDIR_T9                                    \
11176edef35eSSatish Balay                      __SPECIAL_INSTRUCTION_PREAMBLE                 \
11186edef35eSSatish Balay                      /* call-noredir $25 */                         \
11196edef35eSSatish Balay                      "or[32] $t2, $t2, $t2\n\t"
11206edef35eSSatish Balay 
11216edef35eSSatish Balay #define VALGRIND_VEX_INJECT_IR()                                    \
11226edef35eSSatish Balay  do {                                                               \
11236edef35eSSatish Balay     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
11246edef35eSSatish Balay                      "or[32] $t3, $t3, $t3\n\t"                     \
11256edef35eSSatish Balay                     );                                              \
11266edef35eSSatish Balay  } while (0)
11276edef35eSSatish Balay 
11286edef35eSSatish Balay #endif
11296edef35eSSatish Balay /* Insert assembly code for other platforms here... */
11306edef35eSSatish Balay 
11316edef35eSSatish Balay #endif /* NVALGRIND */
11326edef35eSSatish Balay 
11336edef35eSSatish Balay 
11346edef35eSSatish Balay /* ------------------------------------------------------------------ */
11356edef35eSSatish Balay /* PLATFORM SPECIFICS for FUNCTION WRAPPING.  This is all very        */
11366edef35eSSatish Balay /* ugly.  It's the least-worst tradeoff I can think of.               */
11376edef35eSSatish Balay /* ------------------------------------------------------------------ */
11386edef35eSSatish Balay 
11396edef35eSSatish Balay /* This section defines magic (a.k.a appalling-hack) macros for doing
11406edef35eSSatish Balay    guaranteed-no-redirection macros, so as to get from function
11416edef35eSSatish Balay    wrappers to the functions they are wrapping.  The whole point is to
11426edef35eSSatish Balay    construct standard call sequences, but to do the call itself with a
11436edef35eSSatish Balay    special no-redirect call pseudo-instruction that the JIT
11446edef35eSSatish Balay    understands and handles specially.  This section is long and
11456edef35eSSatish Balay    repetitious, and I can't see a way to make it shorter.
11466edef35eSSatish Balay 
11476edef35eSSatish Balay    The naming scheme is as follows:
11486edef35eSSatish Balay 
11496edef35eSSatish Balay       CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc}
11506edef35eSSatish Balay 
11516edef35eSSatish Balay    'W' stands for "word" and 'v' for "void".  Hence there are
11526edef35eSSatish Balay    different macros for calling arity 0, 1, 2, 3, 4, etc, functions,
11536edef35eSSatish Balay    and for each, the possibility of returning a word-typed result, or
11546edef35eSSatish Balay    no result.
11556edef35eSSatish Balay */
11566edef35eSSatish Balay 
11576edef35eSSatish Balay /* Use these to write the name of your wrapper.  NOTE: duplicates
11586edef35eSSatish Balay    VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h.  NOTE also: inserts
1159*1a28a8ebSPierre Jolivet    the default behaviour equivalence class tag "0000" into the name.
11606edef35eSSatish Balay    See pub_tool_redir.h for details -- normally you don't need to
11616edef35eSSatish Balay    think about this, though. */
11626edef35eSSatish Balay 
11636edef35eSSatish Balay /* Use an extra level of macroisation so as to ensure the soname/fnname
11646edef35eSSatish Balay    args are fully macro-expanded before pasting them together. */
11656edef35eSSatish Balay #define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
11666edef35eSSatish Balay 
11676edef35eSSatish Balay #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname)                    \
11686edef35eSSatish Balay    VG_CONCAT4(_vgw00000ZU_,soname,_,fnname)
11696edef35eSSatish Balay 
11706edef35eSSatish Balay #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname)                    \
11716edef35eSSatish Balay    VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname)
11726edef35eSSatish Balay 
11736edef35eSSatish Balay /* Use this macro from within a wrapper function to collect the
11746edef35eSSatish Balay    context (address and possibly other info) of the original function.
11756edef35eSSatish Balay    Once you have that you can then use it in one of the CALL_FN_
11766edef35eSSatish Balay    macros.  The type of the argument _lval is OrigFn. */
11776edef35eSSatish Balay #define VALGRIND_GET_ORIG_FN(_lval)  VALGRIND_GET_NR_CONTEXT(_lval)
11786edef35eSSatish Balay 
11796edef35eSSatish Balay /* Also provide end-user facilities for function replacement, rather
11806edef35eSSatish Balay    than wrapping.  A replacement function differs from a wrapper in
11816edef35eSSatish Balay    that it has no way to get hold of the original function being
11826edef35eSSatish Balay    called, and hence no way to call onwards to it.  In a replacement
11836edef35eSSatish Balay    function, VALGRIND_GET_ORIG_FN always returns zero. */
11846edef35eSSatish Balay 
11856edef35eSSatish Balay #define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname)                 \
11866edef35eSSatish Balay    VG_CONCAT4(_vgr00000ZU_,soname,_,fnname)
11876edef35eSSatish Balay 
11886edef35eSSatish Balay #define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname)                 \
11896edef35eSSatish Balay    VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname)
11906edef35eSSatish Balay 
11916edef35eSSatish Balay /* Derivatives of the main macros below, for calling functions
11926edef35eSSatish Balay    returning void. */
11936edef35eSSatish Balay 
11946edef35eSSatish Balay #define CALL_FN_v_v(fnptr)                                        \
11956edef35eSSatish Balay    do { volatile unsigned long _junk;                             \
11966edef35eSSatish Balay         CALL_FN_W_v(_junk,fnptr); } while (0)
11976edef35eSSatish Balay 
11986edef35eSSatish Balay #define CALL_FN_v_W(fnptr, arg1)                                  \
11996edef35eSSatish Balay    do { volatile unsigned long _junk;                             \
12006edef35eSSatish Balay         CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
12016edef35eSSatish Balay 
12026edef35eSSatish Balay #define CALL_FN_v_WW(fnptr, arg1,arg2)                            \
12036edef35eSSatish Balay    do { volatile unsigned long _junk;                             \
12046edef35eSSatish Balay         CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
12056edef35eSSatish Balay 
12066edef35eSSatish Balay #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3)                      \
12076edef35eSSatish Balay    do { volatile unsigned long _junk;                             \
12086edef35eSSatish Balay         CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
12096edef35eSSatish Balay 
12106edef35eSSatish Balay #define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4)                \
12116edef35eSSatish Balay    do { volatile unsigned long _junk;                             \
12126edef35eSSatish Balay         CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
12136edef35eSSatish Balay 
12146edef35eSSatish Balay #define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5)             \
12156edef35eSSatish Balay    do { volatile unsigned long _junk;                             \
12166edef35eSSatish Balay         CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
12176edef35eSSatish Balay 
12186edef35eSSatish Balay #define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6)        \
12196edef35eSSatish Balay    do { volatile unsigned long _junk;                             \
12206edef35eSSatish Balay         CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
12216edef35eSSatish Balay 
12226edef35eSSatish Balay #define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7)   \
12236edef35eSSatish Balay    do { volatile unsigned long _junk;                             \
12246edef35eSSatish Balay         CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
12256edef35eSSatish Balay 
12266edef35eSSatish Balay /* ----------------- x86-{linux,darwin,solaris} ---------------- */
12276edef35eSSatish Balay 
12286edef35eSSatish Balay #if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin) \
1229cea3dcb8SSatish Balay     ||  defined(PLAT_x86_solaris)  || defined(PLAT_x86_freebsd)
12306edef35eSSatish Balay 
12316edef35eSSatish Balay /* These regs are trashed by the hidden call.  No need to mention eax
12326edef35eSSatish Balay    as gcc can already see that, plus causes gcc to bomb. */
12336edef35eSSatish Balay #define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx"
12346edef35eSSatish Balay 
12356edef35eSSatish Balay /* Macros to save and align the stack before making a function
12366edef35eSSatish Balay    call and restore it afterwards as gcc may not keep the stack
12376edef35eSSatish Balay    pointer aligned if it doesn't realise calls are being made
12386edef35eSSatish Balay    to other functions. */
12396edef35eSSatish Balay 
12406edef35eSSatish Balay #define VALGRIND_ALIGN_STACK               \
12416edef35eSSatish Balay       "movl %%esp,%%edi\n\t"               \
12426edef35eSSatish Balay       "andl $0xfffffff0,%%esp\n\t"
12436edef35eSSatish Balay #define VALGRIND_RESTORE_STACK             \
12446edef35eSSatish Balay       "movl %%edi,%%esp\n\t"
12456edef35eSSatish Balay 
12466edef35eSSatish Balay /* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned
12476edef35eSSatish Balay    long) == 4. */
12486edef35eSSatish Balay 
12496edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                   \
12506edef35eSSatish Balay    do {                                                           \
12516edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
12526edef35eSSatish Balay       volatile unsigned long _argvec[1];                          \
12536edef35eSSatish Balay       volatile unsigned long _res;                                \
12546edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
12556edef35eSSatish Balay       __asm__ volatile(                                           \
12566edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
12576edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
12586edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
12596edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
12606edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
12616edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
12626edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
12636edef35eSSatish Balay       );                                                          \
12646edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
12656edef35eSSatish Balay    } while (0)
12666edef35eSSatish Balay 
12676edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                             \
12686edef35eSSatish Balay    do {                                                           \
12696edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
12706edef35eSSatish Balay       volatile unsigned long _argvec[2];                          \
12716edef35eSSatish Balay       volatile unsigned long _res;                                \
12726edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
12736edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
12746edef35eSSatish Balay       __asm__ volatile(                                           \
12756edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
12766edef35eSSatish Balay          "subl $12, %%esp\n\t"                                    \
12776edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
12786edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
12796edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
12806edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
12816edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
12826edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
12836edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
12846edef35eSSatish Balay       );                                                          \
12856edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
12866edef35eSSatish Balay    } while (0)
12876edef35eSSatish Balay 
12886edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
12896edef35eSSatish Balay    do {                                                           \
12906edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
12916edef35eSSatish Balay       volatile unsigned long _argvec[3];                          \
12926edef35eSSatish Balay       volatile unsigned long _res;                                \
12936edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
12946edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
12956edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
12966edef35eSSatish Balay       __asm__ volatile(                                           \
12976edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
12986edef35eSSatish Balay          "subl $8, %%esp\n\t"                                     \
12996edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
13006edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
13016edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
13026edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
13036edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
13046edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
13056edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
13066edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
13076edef35eSSatish Balay       );                                                          \
13086edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
13096edef35eSSatish Balay    } while (0)
13106edef35eSSatish Balay 
13116edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
13126edef35eSSatish Balay    do {                                                           \
13136edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
13146edef35eSSatish Balay       volatile unsigned long _argvec[4];                          \
13156edef35eSSatish Balay       volatile unsigned long _res;                                \
13166edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
13176edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
13186edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
13196edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
13206edef35eSSatish Balay       __asm__ volatile(                                           \
13216edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
13226edef35eSSatish Balay          "subl $4, %%esp\n\t"                                     \
13236edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
13246edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
13256edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
13266edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
13276edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
13286edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
13296edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
13306edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
13316edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
13326edef35eSSatish Balay       );                                                          \
13336edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
13346edef35eSSatish Balay    } while (0)
13356edef35eSSatish Balay 
13366edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
13376edef35eSSatish Balay    do {                                                           \
13386edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
13396edef35eSSatish Balay       volatile unsigned long _argvec[5];                          \
13406edef35eSSatish Balay       volatile unsigned long _res;                                \
13416edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
13426edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
13436edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
13446edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
13456edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
13466edef35eSSatish Balay       __asm__ volatile(                                           \
13476edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
13486edef35eSSatish Balay          "pushl 16(%%eax)\n\t"                                    \
13496edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
13506edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
13516edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
13526edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
13536edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
13546edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
13556edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
13566edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
13576edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
13586edef35eSSatish Balay       );                                                          \
13596edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
13606edef35eSSatish Balay    } while (0)
13616edef35eSSatish Balay 
13626edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
13636edef35eSSatish Balay    do {                                                           \
13646edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
13656edef35eSSatish Balay       volatile unsigned long _argvec[6];                          \
13666edef35eSSatish Balay       volatile unsigned long _res;                                \
13676edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
13686edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
13696edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
13706edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
13716edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
13726edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
13736edef35eSSatish Balay       __asm__ volatile(                                           \
13746edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
13756edef35eSSatish Balay          "subl $12, %%esp\n\t"                                    \
13766edef35eSSatish Balay          "pushl 20(%%eax)\n\t"                                    \
13776edef35eSSatish Balay          "pushl 16(%%eax)\n\t"                                    \
13786edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
13796edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
13806edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
13816edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
13826edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
13836edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
13846edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
13856edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
13866edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
13876edef35eSSatish Balay       );                                                          \
13886edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
13896edef35eSSatish Balay    } while (0)
13906edef35eSSatish Balay 
13916edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
13926edef35eSSatish Balay    do {                                                           \
13936edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
13946edef35eSSatish Balay       volatile unsigned long _argvec[7];                          \
13956edef35eSSatish Balay       volatile unsigned long _res;                                \
13966edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
13976edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
13986edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
13996edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
14006edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
14016edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
14026edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
14036edef35eSSatish Balay       __asm__ volatile(                                           \
14046edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
14056edef35eSSatish Balay          "subl $8, %%esp\n\t"                                     \
14066edef35eSSatish Balay          "pushl 24(%%eax)\n\t"                                    \
14076edef35eSSatish Balay          "pushl 20(%%eax)\n\t"                                    \
14086edef35eSSatish Balay          "pushl 16(%%eax)\n\t"                                    \
14096edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
14106edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
14116edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
14126edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
14136edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
14146edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
14156edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
14166edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
14176edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
14186edef35eSSatish Balay       );                                                          \
14196edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
14206edef35eSSatish Balay    } while (0)
14216edef35eSSatish Balay 
14226edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
14236edef35eSSatish Balay                                  arg7)                            \
14246edef35eSSatish Balay    do {                                                           \
14256edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
14266edef35eSSatish Balay       volatile unsigned long _argvec[8];                          \
14276edef35eSSatish Balay       volatile unsigned long _res;                                \
14286edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
14296edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
14306edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
14316edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
14326edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
14336edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
14346edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
14356edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
14366edef35eSSatish Balay       __asm__ volatile(                                           \
14376edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
14386edef35eSSatish Balay          "subl $4, %%esp\n\t"                                     \
14396edef35eSSatish Balay          "pushl 28(%%eax)\n\t"                                    \
14406edef35eSSatish Balay          "pushl 24(%%eax)\n\t"                                    \
14416edef35eSSatish Balay          "pushl 20(%%eax)\n\t"                                    \
14426edef35eSSatish Balay          "pushl 16(%%eax)\n\t"                                    \
14436edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
14446edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
14456edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
14466edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
14476edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
14486edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
14496edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
14506edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
14516edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
14526edef35eSSatish Balay       );                                                          \
14536edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
14546edef35eSSatish Balay    } while (0)
14556edef35eSSatish Balay 
14566edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
14576edef35eSSatish Balay                                  arg7,arg8)                       \
14586edef35eSSatish Balay    do {                                                           \
14596edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
14606edef35eSSatish Balay       volatile unsigned long _argvec[9];                          \
14616edef35eSSatish Balay       volatile unsigned long _res;                                \
14626edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
14636edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
14646edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
14656edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
14666edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
14676edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
14686edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
14696edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
14706edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
14716edef35eSSatish Balay       __asm__ volatile(                                           \
14726edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
14736edef35eSSatish Balay          "pushl 32(%%eax)\n\t"                                    \
14746edef35eSSatish Balay          "pushl 28(%%eax)\n\t"                                    \
14756edef35eSSatish Balay          "pushl 24(%%eax)\n\t"                                    \
14766edef35eSSatish Balay          "pushl 20(%%eax)\n\t"                                    \
14776edef35eSSatish Balay          "pushl 16(%%eax)\n\t"                                    \
14786edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
14796edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
14806edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
14816edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
14826edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
14836edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
14846edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
14856edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
14866edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
14876edef35eSSatish Balay       );                                                          \
14886edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
14896edef35eSSatish Balay    } while (0)
14906edef35eSSatish Balay 
14916edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
14926edef35eSSatish Balay                                  arg7,arg8,arg9)                  \
14936edef35eSSatish Balay    do {                                                           \
14946edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
14956edef35eSSatish Balay       volatile unsigned long _argvec[10];                         \
14966edef35eSSatish Balay       volatile unsigned long _res;                                \
14976edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
14986edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
14996edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
15006edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
15016edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
15026edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
15036edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
15046edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
15056edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
15066edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
15076edef35eSSatish Balay       __asm__ volatile(                                           \
15086edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
15096edef35eSSatish Balay          "subl $12, %%esp\n\t"                                    \
15106edef35eSSatish Balay          "pushl 36(%%eax)\n\t"                                    \
15116edef35eSSatish Balay          "pushl 32(%%eax)\n\t"                                    \
15126edef35eSSatish Balay          "pushl 28(%%eax)\n\t"                                    \
15136edef35eSSatish Balay          "pushl 24(%%eax)\n\t"                                    \
15146edef35eSSatish Balay          "pushl 20(%%eax)\n\t"                                    \
15156edef35eSSatish Balay          "pushl 16(%%eax)\n\t"                                    \
15166edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
15176edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
15186edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
15196edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
15206edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
15216edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
15226edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
15236edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
15246edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
15256edef35eSSatish Balay       );                                                          \
15266edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
15276edef35eSSatish Balay    } while (0)
15286edef35eSSatish Balay 
15296edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
15306edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)           \
15316edef35eSSatish Balay    do {                                                           \
15326edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
15336edef35eSSatish Balay       volatile unsigned long _argvec[11];                         \
15346edef35eSSatish Balay       volatile unsigned long _res;                                \
15356edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
15366edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
15376edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
15386edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
15396edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
15406edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
15416edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
15426edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
15436edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
15446edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
15456edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
15466edef35eSSatish Balay       __asm__ volatile(                                           \
15476edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
15486edef35eSSatish Balay          "subl $8, %%esp\n\t"                                     \
15496edef35eSSatish Balay          "pushl 40(%%eax)\n\t"                                    \
15506edef35eSSatish Balay          "pushl 36(%%eax)\n\t"                                    \
15516edef35eSSatish Balay          "pushl 32(%%eax)\n\t"                                    \
15526edef35eSSatish Balay          "pushl 28(%%eax)\n\t"                                    \
15536edef35eSSatish Balay          "pushl 24(%%eax)\n\t"                                    \
15546edef35eSSatish Balay          "pushl 20(%%eax)\n\t"                                    \
15556edef35eSSatish Balay          "pushl 16(%%eax)\n\t"                                    \
15566edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
15576edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
15586edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
15596edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
15606edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
15616edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
15626edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
15636edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
15646edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
15656edef35eSSatish Balay       );                                                          \
15666edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
15676edef35eSSatish Balay    } while (0)
15686edef35eSSatish Balay 
15696edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
15706edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
15716edef35eSSatish Balay                                   arg11)                          \
15726edef35eSSatish Balay    do {                                                           \
15736edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
15746edef35eSSatish Balay       volatile unsigned long _argvec[12];                         \
15756edef35eSSatish Balay       volatile unsigned long _res;                                \
15766edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
15776edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
15786edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
15796edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
15806edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
15816edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
15826edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
15836edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
15846edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
15856edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
15866edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
15876edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
15886edef35eSSatish Balay       __asm__ volatile(                                           \
15896edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
15906edef35eSSatish Balay          "subl $4, %%esp\n\t"                                     \
15916edef35eSSatish Balay          "pushl 44(%%eax)\n\t"                                    \
15926edef35eSSatish Balay          "pushl 40(%%eax)\n\t"                                    \
15936edef35eSSatish Balay          "pushl 36(%%eax)\n\t"                                    \
15946edef35eSSatish Balay          "pushl 32(%%eax)\n\t"                                    \
15956edef35eSSatish Balay          "pushl 28(%%eax)\n\t"                                    \
15966edef35eSSatish Balay          "pushl 24(%%eax)\n\t"                                    \
15976edef35eSSatish Balay          "pushl 20(%%eax)\n\t"                                    \
15986edef35eSSatish Balay          "pushl 16(%%eax)\n\t"                                    \
15996edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
16006edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
16016edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
16026edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
16036edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
16046edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
16056edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
16066edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
16076edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
16086edef35eSSatish Balay       );                                                          \
16096edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
16106edef35eSSatish Balay    } while (0)
16116edef35eSSatish Balay 
16126edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
16136edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
16146edef35eSSatish Balay                                   arg11,arg12)                    \
16156edef35eSSatish Balay    do {                                                           \
16166edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
16176edef35eSSatish Balay       volatile unsigned long _argvec[13];                         \
16186edef35eSSatish Balay       volatile unsigned long _res;                                \
16196edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
16206edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
16216edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
16226edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
16236edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
16246edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
16256edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
16266edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
16276edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
16286edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
16296edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
16306edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
16316edef35eSSatish Balay       _argvec[12] = (unsigned long)(arg12);                       \
16326edef35eSSatish Balay       __asm__ volatile(                                           \
16336edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
16346edef35eSSatish Balay          "pushl 48(%%eax)\n\t"                                    \
16356edef35eSSatish Balay          "pushl 44(%%eax)\n\t"                                    \
16366edef35eSSatish Balay          "pushl 40(%%eax)\n\t"                                    \
16376edef35eSSatish Balay          "pushl 36(%%eax)\n\t"                                    \
16386edef35eSSatish Balay          "pushl 32(%%eax)\n\t"                                    \
16396edef35eSSatish Balay          "pushl 28(%%eax)\n\t"                                    \
16406edef35eSSatish Balay          "pushl 24(%%eax)\n\t"                                    \
16416edef35eSSatish Balay          "pushl 20(%%eax)\n\t"                                    \
16426edef35eSSatish Balay          "pushl 16(%%eax)\n\t"                                    \
16436edef35eSSatish Balay          "pushl 12(%%eax)\n\t"                                    \
16446edef35eSSatish Balay          "pushl 8(%%eax)\n\t"                                     \
16456edef35eSSatish Balay          "pushl 4(%%eax)\n\t"                                     \
16466edef35eSSatish Balay          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
16476edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_EAX                                \
16486edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
16496edef35eSSatish Balay          : /*out*/   "=a" (_res)                                  \
16506edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0])                            \
16516edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
16526edef35eSSatish Balay       );                                                          \
16536edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
16546edef35eSSatish Balay    } while (0)
16556edef35eSSatish Balay 
16566edef35eSSatish Balay #endif /* PLAT_x86_linux || PLAT_x86_darwin || PLAT_x86_solaris */
16576edef35eSSatish Balay 
16586edef35eSSatish Balay /* ---------------- amd64-{linux,darwin,solaris} --------------- */
16596edef35eSSatish Balay 
16606edef35eSSatish Balay #if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin) \
1661cea3dcb8SSatish Balay     ||  defined(PLAT_amd64_solaris)  ||  defined(PLAT_amd64_freebsd)
16626edef35eSSatish Balay 
16636edef35eSSatish Balay /* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */
16646edef35eSSatish Balay 
16656edef35eSSatish Balay /* These regs are trashed by the hidden call. */
16666edef35eSSatish Balay #define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi",       \
16676edef35eSSatish Balay                             "rdi", "r8", "r9", "r10", "r11"
16686edef35eSSatish Balay 
16696edef35eSSatish Balay /* This is all pretty complex.  It's so as to make stack unwinding
16706edef35eSSatish Balay    work reliably.  See bug 243270.  The basic problem is the sub and
16716edef35eSSatish Balay    add of 128 of %rsp in all of the following macros.  If gcc believes
16726edef35eSSatish Balay    the CFA is in %rsp, then unwinding may fail, because what's at the
16736edef35eSSatish Balay    CFA is not what gcc "expected" when it constructs the CFIs for the
16746edef35eSSatish Balay    places where the macros are instantiated.
16756edef35eSSatish Balay 
16766edef35eSSatish Balay    But we can't just add a CFI annotation to increase the CFA offset
16776edef35eSSatish Balay    by 128, to match the sub of 128 from %rsp, because we don't know
16786edef35eSSatish Balay    whether gcc has chosen %rsp as the CFA at that point, or whether it
16796edef35eSSatish Balay    has chosen some other register (eg, %rbp).  In the latter case,
16806edef35eSSatish Balay    adding a CFI annotation to change the CFA offset is simply wrong.
16816edef35eSSatish Balay 
16826edef35eSSatish Balay    So the solution is to get hold of the CFA using
16836edef35eSSatish Balay    __builtin_dwarf_cfa(), put it in a known register, and add a
16846edef35eSSatish Balay    CFI annotation to say what the register is.  We choose %rbp for
16856edef35eSSatish Balay    this (perhaps perversely), because:
16866edef35eSSatish Balay 
16876edef35eSSatish Balay    (1) %rbp is already subject to unwinding.  If a new register was
16886edef35eSSatish Balay        chosen then the unwinder would have to unwind it in all stack
16896edef35eSSatish Balay        traces, which is expensive, and
16906edef35eSSatish Balay 
16916edef35eSSatish Balay    (2) %rbp is already subject to precise exception updates in the
16926edef35eSSatish Balay        JIT.  If a new register was chosen, we'd have to have precise
16936edef35eSSatish Balay        exceptions for it too, which reduces performance of the
16946edef35eSSatish Balay        generated code.
16956edef35eSSatish Balay 
16966edef35eSSatish Balay    However .. one extra complication.  We can't just whack the result
16976edef35eSSatish Balay    of __builtin_dwarf_cfa() into %rbp and then add %rbp to the
16986edef35eSSatish Balay    list of trashed registers at the end of the inline assembly
16996edef35eSSatish Balay    fragments; gcc won't allow %rbp to appear in that list.  Hence
17006edef35eSSatish Balay    instead we need to stash %rbp in %r15 for the duration of the asm,
17016edef35eSSatish Balay    and say that %r15 is trashed instead.  gcc seems happy to go with
17026edef35eSSatish Balay    that.
17036edef35eSSatish Balay 
17046edef35eSSatish Balay    Oh .. and this all needs to be conditionalised so that it is
17056edef35eSSatish Balay    unchanged from before this commit, when compiled with older gccs
17066edef35eSSatish Balay    that don't support __builtin_dwarf_cfa.  Furthermore, since
17076edef35eSSatish Balay    this header file is freestanding, it has to be independent of
17086edef35eSSatish Balay    config.h, and so the following conditionalisation cannot depend on
17096edef35eSSatish Balay    configure time checks.
17106edef35eSSatish Balay 
17116edef35eSSatish Balay    Although it's not clear from
17126edef35eSSatish Balay    'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)',
17136edef35eSSatish Balay    this expression excludes Darwin.
17146edef35eSSatish Balay    .cfi directives in Darwin assembly appear to be completely
17156edef35eSSatish Balay    different and I haven't investigated how they work.
17166edef35eSSatish Balay 
17176edef35eSSatish Balay    For even more entertainment value, note we have to use the
17186edef35eSSatish Balay    completely undocumented __builtin_dwarf_cfa(), which appears to
17196edef35eSSatish Balay    really compute the CFA, whereas __builtin_frame_address(0) claims
17206edef35eSSatish Balay    to but actually doesn't.  See
17216edef35eSSatish Balay    https://bugs.kde.org/show_bug.cgi?id=243270#c47
17226edef35eSSatish Balay */
17236edef35eSSatish Balay #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
17246edef35eSSatish Balay #  define __FRAME_POINTER                                         \
17256edef35eSSatish Balay       ,"r"(__builtin_dwarf_cfa())
17266edef35eSSatish Balay #  define VALGRIND_CFI_PROLOGUE                                   \
17276edef35eSSatish Balay       "movq %%rbp, %%r15\n\t"                                     \
17286edef35eSSatish Balay       "movq %2, %%rbp\n\t"                                        \
17296edef35eSSatish Balay       ".cfi_remember_state\n\t"                                   \
17306edef35eSSatish Balay       ".cfi_def_cfa rbp, 0\n\t"
17316edef35eSSatish Balay #  define VALGRIND_CFI_EPILOGUE                                   \
17326edef35eSSatish Balay       "movq %%r15, %%rbp\n\t"                                     \
17336edef35eSSatish Balay       ".cfi_restore_state\n\t"
17346edef35eSSatish Balay #else
17356edef35eSSatish Balay #  define __FRAME_POINTER
17366edef35eSSatish Balay #  define VALGRIND_CFI_PROLOGUE
17376edef35eSSatish Balay #  define VALGRIND_CFI_EPILOGUE
17386edef35eSSatish Balay #endif
17396edef35eSSatish Balay 
17406edef35eSSatish Balay /* Macros to save and align the stack before making a function
17416edef35eSSatish Balay    call and restore it afterwards as gcc may not keep the stack
17426edef35eSSatish Balay    pointer aligned if it doesn't realise calls are being made
17436edef35eSSatish Balay    to other functions. */
17446edef35eSSatish Balay 
17456edef35eSSatish Balay #define VALGRIND_ALIGN_STACK               \
17466edef35eSSatish Balay       "movq %%rsp,%%r14\n\t"               \
17476edef35eSSatish Balay       "andq $0xfffffffffffffff0,%%rsp\n\t"
17486edef35eSSatish Balay #define VALGRIND_RESTORE_STACK             \
17496edef35eSSatish Balay       "movq %%r14,%%rsp\n\t"
17506edef35eSSatish Balay 
17516edef35eSSatish Balay /* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned
17526edef35eSSatish Balay    long) == 8. */
17536edef35eSSatish Balay 
17546edef35eSSatish Balay /* NB 9 Sept 07.  There is a nasty kludge here in all these CALL_FN_
17556edef35eSSatish Balay    macros.  In order not to trash the stack redzone, we need to drop
17566edef35eSSatish Balay    %rsp by 128 before the hidden call, and restore afterwards.  The
1757*1a28a8ebSPierre Jolivet    nastiness is that it is only by luck that the stack still appears
17586edef35eSSatish Balay    to be unwindable during the hidden call - since then the behaviour
17596edef35eSSatish Balay    of any routine using this macro does not match what the CFI data
17606edef35eSSatish Balay    says.  Sigh.
17616edef35eSSatish Balay 
17626edef35eSSatish Balay    Why is this important?  Imagine that a wrapper has a stack
17636edef35eSSatish Balay    allocated local, and passes to the hidden call, a pointer to it.
17646edef35eSSatish Balay    Because gcc does not know about the hidden call, it may allocate
17656edef35eSSatish Balay    that local in the redzone.  Unfortunately the hidden call may then
17666edef35eSSatish Balay    trash it before it comes to use it.  So we must step clear of the
17676edef35eSSatish Balay    redzone, for the duration of the hidden call, to make it safe.
17686edef35eSSatish Balay 
17696edef35eSSatish Balay    Probably the same problem afflicts the other redzone-style ABIs too
17706edef35eSSatish Balay    (ppc64-linux); but for those, the stack is
17716edef35eSSatish Balay    self describing (none of this CFI nonsense) so at least messing
17726edef35eSSatish Balay    with the stack pointer doesn't give a danger of non-unwindable
17736edef35eSSatish Balay    stack. */
17746edef35eSSatish Balay 
17756edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                        \
17766edef35eSSatish Balay    do {                                                                \
17776edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
17786edef35eSSatish Balay       volatile unsigned long _argvec[1];                               \
17796edef35eSSatish Balay       volatile unsigned long _res;                                     \
17806edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
17816edef35eSSatish Balay       __asm__ volatile(                                                \
17826edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
17836edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
17846edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
17856edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
17866edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
17876edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
17886edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
17896edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
17906edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
17916edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
17926edef35eSSatish Balay       );                                                               \
17936edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
17946edef35eSSatish Balay    } while (0)
17956edef35eSSatish Balay 
17966edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                                  \
17976edef35eSSatish Balay    do {                                                                \
17986edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
17996edef35eSSatish Balay       volatile unsigned long _argvec[2];                               \
18006edef35eSSatish Balay       volatile unsigned long _res;                                     \
18016edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
18026edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
18036edef35eSSatish Balay       __asm__ volatile(                                                \
18046edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
18056edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
18066edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
18076edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
18086edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
18096edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
18106edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
18116edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
18126edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
18136edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
18146edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
18156edef35eSSatish Balay       );                                                               \
18166edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
18176edef35eSSatish Balay    } while (0)
18186edef35eSSatish Balay 
18196edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                            \
18206edef35eSSatish Balay    do {                                                                \
18216edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
18226edef35eSSatish Balay       volatile unsigned long _argvec[3];                               \
18236edef35eSSatish Balay       volatile unsigned long _res;                                     \
18246edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
18256edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
18266edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
18276edef35eSSatish Balay       __asm__ volatile(                                                \
18286edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
18296edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
18306edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
18316edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
18326edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
18336edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
18346edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
18356edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
18366edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
18376edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
18386edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
18396edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
18406edef35eSSatish Balay       );                                                               \
18416edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
18426edef35eSSatish Balay    } while (0)
18436edef35eSSatish Balay 
18446edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                      \
18456edef35eSSatish Balay    do {                                                                \
18466edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
18476edef35eSSatish Balay       volatile unsigned long _argvec[4];                               \
18486edef35eSSatish Balay       volatile unsigned long _res;                                     \
18496edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
18506edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
18516edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
18526edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
18536edef35eSSatish Balay       __asm__ volatile(                                                \
18546edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
18556edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
18566edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
18576edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
18586edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
18596edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
18606edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
18616edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
18626edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
18636edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
18646edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
18656edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
18666edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
18676edef35eSSatish Balay       );                                                               \
18686edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
18696edef35eSSatish Balay    } while (0)
18706edef35eSSatish Balay 
18716edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)                \
18726edef35eSSatish Balay    do {                                                                \
18736edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
18746edef35eSSatish Balay       volatile unsigned long _argvec[5];                               \
18756edef35eSSatish Balay       volatile unsigned long _res;                                     \
18766edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
18776edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
18786edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
18796edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
18806edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                              \
18816edef35eSSatish Balay       __asm__ volatile(                                                \
18826edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
18836edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
18846edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
18856edef35eSSatish Balay          "movq 32(%%rax), %%rcx\n\t"                                   \
18866edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
18876edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
18886edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
18896edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
18906edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
18916edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
18926edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
18936edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
18946edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
18956edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
18966edef35eSSatish Balay       );                                                               \
18976edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
18986edef35eSSatish Balay    } while (0)
18996edef35eSSatish Balay 
19006edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)             \
19016edef35eSSatish Balay    do {                                                                \
19026edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
19036edef35eSSatish Balay       volatile unsigned long _argvec[6];                               \
19046edef35eSSatish Balay       volatile unsigned long _res;                                     \
19056edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
19066edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
19076edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
19086edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
19096edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                              \
19106edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                              \
19116edef35eSSatish Balay       __asm__ volatile(                                                \
19126edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
19136edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
19146edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
19156edef35eSSatish Balay          "movq 40(%%rax), %%r8\n\t"                                    \
19166edef35eSSatish Balay          "movq 32(%%rax), %%rcx\n\t"                                   \
19176edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
19186edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
19196edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
19206edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
19216edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
19226edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
19236edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
19246edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
19256edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
19266edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
19276edef35eSSatish Balay       );                                                               \
19286edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
19296edef35eSSatish Balay    } while (0)
19306edef35eSSatish Balay 
19316edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)        \
19326edef35eSSatish Balay    do {                                                                \
19336edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
19346edef35eSSatish Balay       volatile unsigned long _argvec[7];                               \
19356edef35eSSatish Balay       volatile unsigned long _res;                                     \
19366edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
19376edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
19386edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
19396edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
19406edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                              \
19416edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                              \
19426edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                              \
19436edef35eSSatish Balay       __asm__ volatile(                                                \
19446edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
19456edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
19466edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
19476edef35eSSatish Balay          "movq 48(%%rax), %%r9\n\t"                                    \
19486edef35eSSatish Balay          "movq 40(%%rax), %%r8\n\t"                                    \
19496edef35eSSatish Balay          "movq 32(%%rax), %%rcx\n\t"                                   \
19506edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
19516edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
19526edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
19536edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
19546edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
19556edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
19566edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
19576edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
19586edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
19596edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
19606edef35eSSatish Balay       );                                                               \
19616edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
19626edef35eSSatish Balay    } while (0)
19636edef35eSSatish Balay 
19646edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,        \
19656edef35eSSatish Balay                                  arg7)                                 \
19666edef35eSSatish Balay    do {                                                                \
19676edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
19686edef35eSSatish Balay       volatile unsigned long _argvec[8];                               \
19696edef35eSSatish Balay       volatile unsigned long _res;                                     \
19706edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
19716edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
19726edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
19736edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
19746edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                              \
19756edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                              \
19766edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                              \
19776edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                              \
19786edef35eSSatish Balay       __asm__ volatile(                                                \
19796edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
19806edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
19816edef35eSSatish Balay          "subq $136,%%rsp\n\t"                                         \
19826edef35eSSatish Balay          "pushq 56(%%rax)\n\t"                                         \
19836edef35eSSatish Balay          "movq 48(%%rax), %%r9\n\t"                                    \
19846edef35eSSatish Balay          "movq 40(%%rax), %%r8\n\t"                                    \
19856edef35eSSatish Balay          "movq 32(%%rax), %%rcx\n\t"                                   \
19866edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
19876edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
19886edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
19896edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
19906edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
19916edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
19926edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
19936edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
19946edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
19956edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
19966edef35eSSatish Balay       );                                                               \
19976edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
19986edef35eSSatish Balay    } while (0)
19996edef35eSSatish Balay 
20006edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,        \
20016edef35eSSatish Balay                                  arg7,arg8)                            \
20026edef35eSSatish Balay    do {                                                                \
20036edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
20046edef35eSSatish Balay       volatile unsigned long _argvec[9];                               \
20056edef35eSSatish Balay       volatile unsigned long _res;                                     \
20066edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
20076edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
20086edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
20096edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
20106edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                              \
20116edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                              \
20126edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                              \
20136edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                              \
20146edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                              \
20156edef35eSSatish Balay       __asm__ volatile(                                                \
20166edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
20176edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
20186edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
20196edef35eSSatish Balay          "pushq 64(%%rax)\n\t"                                         \
20206edef35eSSatish Balay          "pushq 56(%%rax)\n\t"                                         \
20216edef35eSSatish Balay          "movq 48(%%rax), %%r9\n\t"                                    \
20226edef35eSSatish Balay          "movq 40(%%rax), %%r8\n\t"                                    \
20236edef35eSSatish Balay          "movq 32(%%rax), %%rcx\n\t"                                   \
20246edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
20256edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
20266edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
20276edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
20286edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
20296edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
20306edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
20316edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
20326edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
20336edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
20346edef35eSSatish Balay       );                                                               \
20356edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
20366edef35eSSatish Balay    } while (0)
20376edef35eSSatish Balay 
20386edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,        \
20396edef35eSSatish Balay                                  arg7,arg8,arg9)                       \
20406edef35eSSatish Balay    do {                                                                \
20416edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
20426edef35eSSatish Balay       volatile unsigned long _argvec[10];                              \
20436edef35eSSatish Balay       volatile unsigned long _res;                                     \
20446edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
20456edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
20466edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
20476edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
20486edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                              \
20496edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                              \
20506edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                              \
20516edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                              \
20526edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                              \
20536edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                              \
20546edef35eSSatish Balay       __asm__ volatile(                                                \
20556edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
20566edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
20576edef35eSSatish Balay          "subq $136,%%rsp\n\t"                                         \
20586edef35eSSatish Balay          "pushq 72(%%rax)\n\t"                                         \
20596edef35eSSatish Balay          "pushq 64(%%rax)\n\t"                                         \
20606edef35eSSatish Balay          "pushq 56(%%rax)\n\t"                                         \
20616edef35eSSatish Balay          "movq 48(%%rax), %%r9\n\t"                                    \
20626edef35eSSatish Balay          "movq 40(%%rax), %%r8\n\t"                                    \
20636edef35eSSatish Balay          "movq 32(%%rax), %%rcx\n\t"                                   \
20646edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
20656edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
20666edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
20676edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
20686edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
20696edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
20706edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
20716edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
20726edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
20736edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
20746edef35eSSatish Balay       );                                                               \
20756edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
20766edef35eSSatish Balay    } while (0)
20776edef35eSSatish Balay 
20786edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,       \
20796edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)                \
20806edef35eSSatish Balay    do {                                                                \
20816edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
20826edef35eSSatish Balay       volatile unsigned long _argvec[11];                              \
20836edef35eSSatish Balay       volatile unsigned long _res;                                     \
20846edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
20856edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
20866edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
20876edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
20886edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                              \
20896edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                              \
20906edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                              \
20916edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                              \
20926edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                              \
20936edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                              \
20946edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                            \
20956edef35eSSatish Balay       __asm__ volatile(                                                \
20966edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
20976edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
20986edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
20996edef35eSSatish Balay          "pushq 80(%%rax)\n\t"                                         \
21006edef35eSSatish Balay          "pushq 72(%%rax)\n\t"                                         \
21016edef35eSSatish Balay          "pushq 64(%%rax)\n\t"                                         \
21026edef35eSSatish Balay          "pushq 56(%%rax)\n\t"                                         \
21036edef35eSSatish Balay          "movq 48(%%rax), %%r9\n\t"                                    \
21046edef35eSSatish Balay          "movq 40(%%rax), %%r8\n\t"                                    \
21056edef35eSSatish Balay          "movq 32(%%rax), %%rcx\n\t"                                   \
21066edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
21076edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
21086edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
21096edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
21106edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
21116edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
21126edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
21136edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
21146edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
21156edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
21166edef35eSSatish Balay       );                                                               \
21176edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
21186edef35eSSatish Balay    } while (0)
21196edef35eSSatish Balay 
21206edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,       \
21216edef35eSSatish Balay                                   arg7,arg8,arg9,arg10,arg11)          \
21226edef35eSSatish Balay    do {                                                                \
21236edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
21246edef35eSSatish Balay       volatile unsigned long _argvec[12];                              \
21256edef35eSSatish Balay       volatile unsigned long _res;                                     \
21266edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
21276edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
21286edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
21296edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
21306edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                              \
21316edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                              \
21326edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                              \
21336edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                              \
21346edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                              \
21356edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                              \
21366edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                            \
21376edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                            \
21386edef35eSSatish Balay       __asm__ volatile(                                                \
21396edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
21406edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
21416edef35eSSatish Balay          "subq $136,%%rsp\n\t"                                         \
21426edef35eSSatish Balay          "pushq 88(%%rax)\n\t"                                         \
21436edef35eSSatish Balay          "pushq 80(%%rax)\n\t"                                         \
21446edef35eSSatish Balay          "pushq 72(%%rax)\n\t"                                         \
21456edef35eSSatish Balay          "pushq 64(%%rax)\n\t"                                         \
21466edef35eSSatish Balay          "pushq 56(%%rax)\n\t"                                         \
21476edef35eSSatish Balay          "movq 48(%%rax), %%r9\n\t"                                    \
21486edef35eSSatish Balay          "movq 40(%%rax), %%r8\n\t"                                    \
21496edef35eSSatish Balay          "movq 32(%%rax), %%rcx\n\t"                                   \
21506edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
21516edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
21526edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
21536edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
21546edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
21556edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
21566edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
21576edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
21586edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
21596edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
21606edef35eSSatish Balay       );                                                               \
21616edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
21626edef35eSSatish Balay    } while (0)
21636edef35eSSatish Balay 
21646edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,       \
21656edef35eSSatish Balay                                 arg7,arg8,arg9,arg10,arg11,arg12)      \
21666edef35eSSatish Balay    do {                                                                \
21676edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                           \
21686edef35eSSatish Balay       volatile unsigned long _argvec[13];                              \
21696edef35eSSatish Balay       volatile unsigned long _res;                                     \
21706edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                        \
21716edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                              \
21726edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                              \
21736edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                              \
21746edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                              \
21756edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                              \
21766edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                              \
21776edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                              \
21786edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                              \
21796edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                              \
21806edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                            \
21816edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                            \
21826edef35eSSatish Balay       _argvec[12] = (unsigned long)(arg12);                            \
21836edef35eSSatish Balay       __asm__ volatile(                                                \
21846edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                         \
21856edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                          \
21866edef35eSSatish Balay          "subq $128,%%rsp\n\t"                                         \
21876edef35eSSatish Balay          "pushq 96(%%rax)\n\t"                                         \
21886edef35eSSatish Balay          "pushq 88(%%rax)\n\t"                                         \
21896edef35eSSatish Balay          "pushq 80(%%rax)\n\t"                                         \
21906edef35eSSatish Balay          "pushq 72(%%rax)\n\t"                                         \
21916edef35eSSatish Balay          "pushq 64(%%rax)\n\t"                                         \
21926edef35eSSatish Balay          "pushq 56(%%rax)\n\t"                                         \
21936edef35eSSatish Balay          "movq 48(%%rax), %%r9\n\t"                                    \
21946edef35eSSatish Balay          "movq 40(%%rax), %%r8\n\t"                                    \
21956edef35eSSatish Balay          "movq 32(%%rax), %%rcx\n\t"                                   \
21966edef35eSSatish Balay          "movq 24(%%rax), %%rdx\n\t"                                   \
21976edef35eSSatish Balay          "movq 16(%%rax), %%rsi\n\t"                                   \
21986edef35eSSatish Balay          "movq 8(%%rax), %%rdi\n\t"                                    \
21996edef35eSSatish Balay          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
22006edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_RAX                                     \
22016edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                        \
22026edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                         \
22036edef35eSSatish Balay          : /*out*/   "=a" (_res)                                       \
22046edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
22056edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
22066edef35eSSatish Balay       );                                                               \
22076edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                                  \
22086edef35eSSatish Balay    } while (0)
22096edef35eSSatish Balay 
22106edef35eSSatish Balay #endif /* PLAT_amd64_linux || PLAT_amd64_darwin || PLAT_amd64_solaris */
22116edef35eSSatish Balay 
22126edef35eSSatish Balay /* ------------------------ ppc32-linux ------------------------ */
22136edef35eSSatish Balay 
22146edef35eSSatish Balay #if defined(PLAT_ppc32_linux)
22156edef35eSSatish Balay 
22166edef35eSSatish Balay /* This is useful for finding out about the on-stack stuff:
22176edef35eSSatish Balay 
22186edef35eSSatish Balay    extern int f9  ( int,int,int,int,int,int,int,int,int );
22196edef35eSSatish Balay    extern int f10 ( int,int,int,int,int,int,int,int,int,int );
22206edef35eSSatish Balay    extern int f11 ( int,int,int,int,int,int,int,int,int,int,int );
22216edef35eSSatish Balay    extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int );
22226edef35eSSatish Balay 
22236edef35eSSatish Balay    int g9 ( void ) {
22246edef35eSSatish Balay       return f9(11,22,33,44,55,66,77,88,99);
22256edef35eSSatish Balay    }
22266edef35eSSatish Balay    int g10 ( void ) {
22276edef35eSSatish Balay       return f10(11,22,33,44,55,66,77,88,99,110);
22286edef35eSSatish Balay    }
22296edef35eSSatish Balay    int g11 ( void ) {
22306edef35eSSatish Balay       return f11(11,22,33,44,55,66,77,88,99,110,121);
22316edef35eSSatish Balay    }
22326edef35eSSatish Balay    int g12 ( void ) {
22336edef35eSSatish Balay       return f12(11,22,33,44,55,66,77,88,99,110,121,132);
22346edef35eSSatish Balay    }
22356edef35eSSatish Balay */
22366edef35eSSatish Balay 
22376edef35eSSatish Balay /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
22386edef35eSSatish Balay 
22396edef35eSSatish Balay /* These regs are trashed by the hidden call. */
22406edef35eSSatish Balay #define __CALLER_SAVED_REGS                                       \
22416edef35eSSatish Balay    "lr", "ctr", "xer",                                            \
22426edef35eSSatish Balay    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
22436edef35eSSatish Balay    "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
22446edef35eSSatish Balay    "r11", "r12", "r13"
22456edef35eSSatish Balay 
22466edef35eSSatish Balay /* Macros to save and align the stack before making a function
22476edef35eSSatish Balay    call and restore it afterwards as gcc may not keep the stack
22486edef35eSSatish Balay    pointer aligned if it doesn't realise calls are being made
22496edef35eSSatish Balay    to other functions. */
22506edef35eSSatish Balay 
22516edef35eSSatish Balay #define VALGRIND_ALIGN_STACK               \
22526edef35eSSatish Balay       "mr 28,1\n\t"                        \
22536edef35eSSatish Balay       "rlwinm 1,1,0,0,27\n\t"
22546edef35eSSatish Balay #define VALGRIND_RESTORE_STACK             \
22556edef35eSSatish Balay       "mr 1,28\n\t"
22566edef35eSSatish Balay 
22576edef35eSSatish Balay /* These CALL_FN_ macros assume that on ppc32-linux,
22586edef35eSSatish Balay    sizeof(unsigned long) == 4. */
22596edef35eSSatish Balay 
22606edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                   \
22616edef35eSSatish Balay    do {                                                           \
22626edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
22636edef35eSSatish Balay       volatile unsigned long _argvec[1];                          \
22646edef35eSSatish Balay       volatile unsigned long _res;                                \
22656edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
22666edef35eSSatish Balay       __asm__ volatile(                                           \
22676edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
22686edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
22696edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
22706edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
22716edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
22726edef35eSSatish Balay          "mr %0,3"                                                \
22736edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
22746edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
22756edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
22766edef35eSSatish Balay       );                                                          \
22776edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
22786edef35eSSatish Balay    } while (0)
22796edef35eSSatish Balay 
22806edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                             \
22816edef35eSSatish Balay    do {                                                           \
22826edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
22836edef35eSSatish Balay       volatile unsigned long _argvec[2];                          \
22846edef35eSSatish Balay       volatile unsigned long _res;                                \
22856edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
22866edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
22876edef35eSSatish Balay       __asm__ volatile(                                           \
22886edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
22896edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
22906edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
22916edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
22926edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
22936edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
22946edef35eSSatish Balay          "mr %0,3"                                                \
22956edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
22966edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
22976edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
22986edef35eSSatish Balay       );                                                          \
22996edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
23006edef35eSSatish Balay    } while (0)
23016edef35eSSatish Balay 
23026edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
23036edef35eSSatish Balay    do {                                                           \
23046edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
23056edef35eSSatish Balay       volatile unsigned long _argvec[3];                          \
23066edef35eSSatish Balay       volatile unsigned long _res;                                \
23076edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
23086edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
23096edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
23106edef35eSSatish Balay       __asm__ volatile(                                           \
23116edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
23126edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
23136edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
23146edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
23156edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
23166edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
23176edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
23186edef35eSSatish Balay          "mr %0,3"                                                \
23196edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
23206edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
23216edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
23226edef35eSSatish Balay       );                                                          \
23236edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
23246edef35eSSatish Balay    } while (0)
23256edef35eSSatish Balay 
23266edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
23276edef35eSSatish Balay    do {                                                           \
23286edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
23296edef35eSSatish Balay       volatile unsigned long _argvec[4];                          \
23306edef35eSSatish Balay       volatile unsigned long _res;                                \
23316edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
23326edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
23336edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
23346edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
23356edef35eSSatish Balay       __asm__ volatile(                                           \
23366edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
23376edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
23386edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
23396edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
23406edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
23416edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
23426edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
23436edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
23446edef35eSSatish Balay          "mr %0,3"                                                \
23456edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
23466edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
23476edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
23486edef35eSSatish Balay       );                                                          \
23496edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
23506edef35eSSatish Balay    } while (0)
23516edef35eSSatish Balay 
23526edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
23536edef35eSSatish Balay    do {                                                           \
23546edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
23556edef35eSSatish Balay       volatile unsigned long _argvec[5];                          \
23566edef35eSSatish Balay       volatile unsigned long _res;                                \
23576edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
23586edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
23596edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
23606edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
23616edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                           \
23626edef35eSSatish Balay       __asm__ volatile(                                           \
23636edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
23646edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
23656edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
23666edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
23676edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
23686edef35eSSatish Balay          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
23696edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
23706edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
23716edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
23726edef35eSSatish Balay          "mr %0,3"                                                \
23736edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
23746edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
23756edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
23766edef35eSSatish Balay       );                                                          \
23776edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
23786edef35eSSatish Balay    } while (0)
23796edef35eSSatish Balay 
23806edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
23816edef35eSSatish Balay    do {                                                           \
23826edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
23836edef35eSSatish Balay       volatile unsigned long _argvec[6];                          \
23846edef35eSSatish Balay       volatile unsigned long _res;                                \
23856edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
23866edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
23876edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
23886edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
23896edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                           \
23906edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                           \
23916edef35eSSatish Balay       __asm__ volatile(                                           \
23926edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
23936edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
23946edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
23956edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
23966edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
23976edef35eSSatish Balay          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
23986edef35eSSatish Balay          "lwz 7,20(11)\n\t"                                       \
23996edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
24006edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
24016edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
24026edef35eSSatish Balay          "mr %0,3"                                                \
24036edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
24046edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
24056edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
24066edef35eSSatish Balay       );                                                          \
24076edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
24086edef35eSSatish Balay    } while (0)
24096edef35eSSatish Balay 
24106edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
24116edef35eSSatish Balay    do {                                                           \
24126edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
24136edef35eSSatish Balay       volatile unsigned long _argvec[7];                          \
24146edef35eSSatish Balay       volatile unsigned long _res;                                \
24156edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
24166edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
24176edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
24186edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
24196edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                           \
24206edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                           \
24216edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                           \
24226edef35eSSatish Balay       __asm__ volatile(                                           \
24236edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
24246edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
24256edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
24266edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
24276edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
24286edef35eSSatish Balay          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
24296edef35eSSatish Balay          "lwz 7,20(11)\n\t"                                       \
24306edef35eSSatish Balay          "lwz 8,24(11)\n\t"                                       \
24316edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
24326edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
24336edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
24346edef35eSSatish Balay          "mr %0,3"                                                \
24356edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
24366edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
24376edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
24386edef35eSSatish Balay       );                                                          \
24396edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
24406edef35eSSatish Balay    } while (0)
24416edef35eSSatish Balay 
24426edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
24436edef35eSSatish Balay                                  arg7)                            \
24446edef35eSSatish Balay    do {                                                           \
24456edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
24466edef35eSSatish Balay       volatile unsigned long _argvec[8];                          \
24476edef35eSSatish Balay       volatile unsigned long _res;                                \
24486edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
24496edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
24506edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
24516edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
24526edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                           \
24536edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                           \
24546edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                           \
24556edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                           \
24566edef35eSSatish Balay       __asm__ volatile(                                           \
24576edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
24586edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
24596edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
24606edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
24616edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
24626edef35eSSatish Balay          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
24636edef35eSSatish Balay          "lwz 7,20(11)\n\t"                                       \
24646edef35eSSatish Balay          "lwz 8,24(11)\n\t"                                       \
24656edef35eSSatish Balay          "lwz 9,28(11)\n\t"                                       \
24666edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
24676edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
24686edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
24696edef35eSSatish Balay          "mr %0,3"                                                \
24706edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
24716edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
24726edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
24736edef35eSSatish Balay       );                                                          \
24746edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
24756edef35eSSatish Balay    } while (0)
24766edef35eSSatish Balay 
24776edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
24786edef35eSSatish Balay                                  arg7,arg8)                       \
24796edef35eSSatish Balay    do {                                                           \
24806edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
24816edef35eSSatish Balay       volatile unsigned long _argvec[9];                          \
24826edef35eSSatish Balay       volatile unsigned long _res;                                \
24836edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
24846edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
24856edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
24866edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
24876edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                           \
24886edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                           \
24896edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                           \
24906edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                           \
24916edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                           \
24926edef35eSSatish Balay       __asm__ volatile(                                           \
24936edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
24946edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
24956edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
24966edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
24976edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
24986edef35eSSatish Balay          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
24996edef35eSSatish Balay          "lwz 7,20(11)\n\t"                                       \
25006edef35eSSatish Balay          "lwz 8,24(11)\n\t"                                       \
25016edef35eSSatish Balay          "lwz 9,28(11)\n\t"                                       \
25026edef35eSSatish Balay          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
25036edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
25046edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
25056edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
25066edef35eSSatish Balay          "mr %0,3"                                                \
25076edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
25086edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
25096edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
25106edef35eSSatish Balay       );                                                          \
25116edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
25126edef35eSSatish Balay    } while (0)
25136edef35eSSatish Balay 
25146edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
25156edef35eSSatish Balay                                  arg7,arg8,arg9)                  \
25166edef35eSSatish Balay    do {                                                           \
25176edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
25186edef35eSSatish Balay       volatile unsigned long _argvec[10];                         \
25196edef35eSSatish Balay       volatile unsigned long _res;                                \
25206edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
25216edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
25226edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
25236edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
25246edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                           \
25256edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                           \
25266edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                           \
25276edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                           \
25286edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                           \
25296edef35eSSatish Balay       _argvec[9] = (unsigned long)arg9;                           \
25306edef35eSSatish Balay       __asm__ volatile(                                           \
25316edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
25326edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
25336edef35eSSatish Balay          "addi 1,1,-16\n\t"                                       \
25346edef35eSSatish Balay          /* arg9 */                                               \
25356edef35eSSatish Balay          "lwz 3,36(11)\n\t"                                       \
25366edef35eSSatish Balay          "stw 3,8(1)\n\t"                                         \
25376edef35eSSatish Balay          /* args1-8 */                                            \
25386edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
25396edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
25406edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
25416edef35eSSatish Balay          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
25426edef35eSSatish Balay          "lwz 7,20(11)\n\t"                                       \
25436edef35eSSatish Balay          "lwz 8,24(11)\n\t"                                       \
25446edef35eSSatish Balay          "lwz 9,28(11)\n\t"                                       \
25456edef35eSSatish Balay          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
25466edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
25476edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
25486edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
25496edef35eSSatish Balay          "mr %0,3"                                                \
25506edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
25516edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
25526edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
25536edef35eSSatish Balay       );                                                          \
25546edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
25556edef35eSSatish Balay    } while (0)
25566edef35eSSatish Balay 
25576edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
25586edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)           \
25596edef35eSSatish Balay    do {                                                           \
25606edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
25616edef35eSSatish Balay       volatile unsigned long _argvec[11];                         \
25626edef35eSSatish Balay       volatile unsigned long _res;                                \
25636edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
25646edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
25656edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
25666edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
25676edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                           \
25686edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                           \
25696edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                           \
25706edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                           \
25716edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                           \
25726edef35eSSatish Balay       _argvec[9] = (unsigned long)arg9;                           \
25736edef35eSSatish Balay       _argvec[10] = (unsigned long)arg10;                         \
25746edef35eSSatish Balay       __asm__ volatile(                                           \
25756edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
25766edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
25776edef35eSSatish Balay          "addi 1,1,-16\n\t"                                       \
25786edef35eSSatish Balay          /* arg10 */                                              \
25796edef35eSSatish Balay          "lwz 3,40(11)\n\t"                                       \
25806edef35eSSatish Balay          "stw 3,12(1)\n\t"                                        \
25816edef35eSSatish Balay          /* arg9 */                                               \
25826edef35eSSatish Balay          "lwz 3,36(11)\n\t"                                       \
25836edef35eSSatish Balay          "stw 3,8(1)\n\t"                                         \
25846edef35eSSatish Balay          /* args1-8 */                                            \
25856edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
25866edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
25876edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
25886edef35eSSatish Balay          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
25896edef35eSSatish Balay          "lwz 7,20(11)\n\t"                                       \
25906edef35eSSatish Balay          "lwz 8,24(11)\n\t"                                       \
25916edef35eSSatish Balay          "lwz 9,28(11)\n\t"                                       \
25926edef35eSSatish Balay          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
25936edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
25946edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
25956edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
25966edef35eSSatish Balay          "mr %0,3"                                                \
25976edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
25986edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
25996edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
26006edef35eSSatish Balay       );                                                          \
26016edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
26026edef35eSSatish Balay    } while (0)
26036edef35eSSatish Balay 
26046edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
26056edef35eSSatish Balay                                   arg7,arg8,arg9,arg10,arg11)     \
26066edef35eSSatish Balay    do {                                                           \
26076edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
26086edef35eSSatish Balay       volatile unsigned long _argvec[12];                         \
26096edef35eSSatish Balay       volatile unsigned long _res;                                \
26106edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
26116edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
26126edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
26136edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
26146edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                           \
26156edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                           \
26166edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                           \
26176edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                           \
26186edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                           \
26196edef35eSSatish Balay       _argvec[9] = (unsigned long)arg9;                           \
26206edef35eSSatish Balay       _argvec[10] = (unsigned long)arg10;                         \
26216edef35eSSatish Balay       _argvec[11] = (unsigned long)arg11;                         \
26226edef35eSSatish Balay       __asm__ volatile(                                           \
26236edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
26246edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
26256edef35eSSatish Balay          "addi 1,1,-32\n\t"                                       \
26266edef35eSSatish Balay          /* arg11 */                                              \
26276edef35eSSatish Balay          "lwz 3,44(11)\n\t"                                       \
26286edef35eSSatish Balay          "stw 3,16(1)\n\t"                                        \
26296edef35eSSatish Balay          /* arg10 */                                              \
26306edef35eSSatish Balay          "lwz 3,40(11)\n\t"                                       \
26316edef35eSSatish Balay          "stw 3,12(1)\n\t"                                        \
26326edef35eSSatish Balay          /* arg9 */                                               \
26336edef35eSSatish Balay          "lwz 3,36(11)\n\t"                                       \
26346edef35eSSatish Balay          "stw 3,8(1)\n\t"                                         \
26356edef35eSSatish Balay          /* args1-8 */                                            \
26366edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
26376edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
26386edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
26396edef35eSSatish Balay          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
26406edef35eSSatish Balay          "lwz 7,20(11)\n\t"                                       \
26416edef35eSSatish Balay          "lwz 8,24(11)\n\t"                                       \
26426edef35eSSatish Balay          "lwz 9,28(11)\n\t"                                       \
26436edef35eSSatish Balay          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
26446edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
26456edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
26466edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
26476edef35eSSatish Balay          "mr %0,3"                                                \
26486edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
26496edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
26506edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
26516edef35eSSatish Balay       );                                                          \
26526edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
26536edef35eSSatish Balay    } while (0)
26546edef35eSSatish Balay 
26556edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
26566edef35eSSatish Balay                                 arg7,arg8,arg9,arg10,arg11,arg12) \
26576edef35eSSatish Balay    do {                                                           \
26586edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
26596edef35eSSatish Balay       volatile unsigned long _argvec[13];                         \
26606edef35eSSatish Balay       volatile unsigned long _res;                                \
26616edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
26626edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                           \
26636edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                           \
26646edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                           \
26656edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                           \
26666edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                           \
26676edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                           \
26686edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                           \
26696edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                           \
26706edef35eSSatish Balay       _argvec[9] = (unsigned long)arg9;                           \
26716edef35eSSatish Balay       _argvec[10] = (unsigned long)arg10;                         \
26726edef35eSSatish Balay       _argvec[11] = (unsigned long)arg11;                         \
26736edef35eSSatish Balay       _argvec[12] = (unsigned long)arg12;                         \
26746edef35eSSatish Balay       __asm__ volatile(                                           \
26756edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
26766edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
26776edef35eSSatish Balay          "addi 1,1,-32\n\t"                                       \
26786edef35eSSatish Balay          /* arg12 */                                              \
26796edef35eSSatish Balay          "lwz 3,48(11)\n\t"                                       \
26806edef35eSSatish Balay          "stw 3,20(1)\n\t"                                        \
26816edef35eSSatish Balay          /* arg11 */                                              \
26826edef35eSSatish Balay          "lwz 3,44(11)\n\t"                                       \
26836edef35eSSatish Balay          "stw 3,16(1)\n\t"                                        \
26846edef35eSSatish Balay          /* arg10 */                                              \
26856edef35eSSatish Balay          "lwz 3,40(11)\n\t"                                       \
26866edef35eSSatish Balay          "stw 3,12(1)\n\t"                                        \
26876edef35eSSatish Balay          /* arg9 */                                               \
26886edef35eSSatish Balay          "lwz 3,36(11)\n\t"                                       \
26896edef35eSSatish Balay          "stw 3,8(1)\n\t"                                         \
26906edef35eSSatish Balay          /* args1-8 */                                            \
26916edef35eSSatish Balay          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
26926edef35eSSatish Balay          "lwz 4,8(11)\n\t"                                        \
26936edef35eSSatish Balay          "lwz 5,12(11)\n\t"                                       \
26946edef35eSSatish Balay          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
26956edef35eSSatish Balay          "lwz 7,20(11)\n\t"                                       \
26966edef35eSSatish Balay          "lwz 8,24(11)\n\t"                                       \
26976edef35eSSatish Balay          "lwz 9,28(11)\n\t"                                       \
26986edef35eSSatish Balay          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
26996edef35eSSatish Balay          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
27006edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
27016edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
27026edef35eSSatish Balay          "mr %0,3"                                                \
27036edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
27046edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
27056edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
27066edef35eSSatish Balay       );                                                          \
27076edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
27086edef35eSSatish Balay    } while (0)
27096edef35eSSatish Balay 
27106edef35eSSatish Balay #endif /* PLAT_ppc32_linux */
27116edef35eSSatish Balay 
27126edef35eSSatish Balay /* ------------------------ ppc64-linux ------------------------ */
27136edef35eSSatish Balay 
27146edef35eSSatish Balay #if defined(PLAT_ppc64be_linux)
27156edef35eSSatish Balay 
27166edef35eSSatish Balay /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
27176edef35eSSatish Balay 
27186edef35eSSatish Balay /* These regs are trashed by the hidden call. */
27196edef35eSSatish Balay #define __CALLER_SAVED_REGS                                       \
27206edef35eSSatish Balay    "lr", "ctr", "xer",                                            \
27216edef35eSSatish Balay    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
27226edef35eSSatish Balay    "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",         \
27236edef35eSSatish Balay    "r11", "r12", "r13"
27246edef35eSSatish Balay 
27256edef35eSSatish Balay /* Macros to save and align the stack before making a function
27266edef35eSSatish Balay    call and restore it afterwards as gcc may not keep the stack
27276edef35eSSatish Balay    pointer aligned if it doesn't realise calls are being made
27286edef35eSSatish Balay    to other functions. */
27296edef35eSSatish Balay 
27306edef35eSSatish Balay #define VALGRIND_ALIGN_STACK               \
27316edef35eSSatish Balay       "mr 28,1\n\t"                        \
27326edef35eSSatish Balay       "rldicr 1,1,0,59\n\t"
27336edef35eSSatish Balay #define VALGRIND_RESTORE_STACK             \
27346edef35eSSatish Balay       "mr 1,28\n\t"
27356edef35eSSatish Balay 
27366edef35eSSatish Balay /* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
27376edef35eSSatish Balay    long) == 8. */
27386edef35eSSatish Balay 
27396edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                   \
27406edef35eSSatish Balay    do {                                                           \
27416edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
27426edef35eSSatish Balay       volatile unsigned long _argvec[3+0];                        \
27436edef35eSSatish Balay       volatile unsigned long _res;                                \
27446edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
27456edef35eSSatish Balay       _argvec[1] = (unsigned long)_orig.r2;                       \
27466edef35eSSatish Balay       _argvec[2] = (unsigned long)_orig.nraddr;                   \
27476edef35eSSatish Balay       __asm__ volatile(                                           \
27486edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
27496edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
27506edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
27516edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
27526edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
27536edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
27546edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
27556edef35eSSatish Balay          "mr %0,3\n\t"                                            \
27566edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
27576edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
27586edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
27596edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
27606edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
27616edef35eSSatish Balay       );                                                          \
27626edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
27636edef35eSSatish Balay    } while (0)
27646edef35eSSatish Balay 
27656edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                             \
27666edef35eSSatish Balay    do {                                                           \
27676edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
27686edef35eSSatish Balay       volatile unsigned long _argvec[3+1];                        \
27696edef35eSSatish Balay       volatile unsigned long _res;                                \
27706edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
27716edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
27726edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
27736edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
27746edef35eSSatish Balay       __asm__ volatile(                                           \
27756edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
27766edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
27776edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
27786edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
27796edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
27806edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
27816edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
27826edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
27836edef35eSSatish Balay          "mr %0,3\n\t"                                            \
27846edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
27856edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
27866edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
27876edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
27886edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
27896edef35eSSatish Balay       );                                                          \
27906edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
27916edef35eSSatish Balay    } while (0)
27926edef35eSSatish Balay 
27936edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
27946edef35eSSatish Balay    do {                                                           \
27956edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
27966edef35eSSatish Balay       volatile unsigned long _argvec[3+2];                        \
27976edef35eSSatish Balay       volatile unsigned long _res;                                \
27986edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
27996edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
28006edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
28016edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
28026edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
28036edef35eSSatish Balay       __asm__ volatile(                                           \
28046edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
28056edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
28066edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
28076edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
28086edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
28096edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
28106edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
28116edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
28126edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
28136edef35eSSatish Balay          "mr %0,3\n\t"                                            \
28146edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
28156edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
28166edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
28176edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
28186edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
28196edef35eSSatish Balay       );                                                          \
28206edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
28216edef35eSSatish Balay    } while (0)
28226edef35eSSatish Balay 
28236edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
28246edef35eSSatish Balay    do {                                                           \
28256edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
28266edef35eSSatish Balay       volatile unsigned long _argvec[3+3];                        \
28276edef35eSSatish Balay       volatile unsigned long _res;                                \
28286edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
28296edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
28306edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
28316edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
28326edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
28336edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
28346edef35eSSatish Balay       __asm__ volatile(                                           \
28356edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
28366edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
28376edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
28386edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
28396edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
28406edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
28416edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
28426edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
28436edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
28446edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
28456edef35eSSatish Balay          "mr %0,3\n\t"                                            \
28466edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
28476edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
28486edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
28496edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
28506edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
28516edef35eSSatish Balay       );                                                          \
28526edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
28536edef35eSSatish Balay    } while (0)
28546edef35eSSatish Balay 
28556edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
28566edef35eSSatish Balay    do {                                                           \
28576edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
28586edef35eSSatish Balay       volatile unsigned long _argvec[3+4];                        \
28596edef35eSSatish Balay       volatile unsigned long _res;                                \
28606edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
28616edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
28626edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
28636edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
28646edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
28656edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
28666edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
28676edef35eSSatish Balay       __asm__ volatile(                                           \
28686edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
28696edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
28706edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
28716edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
28726edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
28736edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
28746edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
28756edef35eSSatish Balay          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
28766edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
28776edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
28786edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
28796edef35eSSatish Balay          "mr %0,3\n\t"                                            \
28806edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
28816edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
28826edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
28836edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
28846edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
28856edef35eSSatish Balay       );                                                          \
28866edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
28876edef35eSSatish Balay    } while (0)
28886edef35eSSatish Balay 
28896edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
28906edef35eSSatish Balay    do {                                                           \
28916edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
28926edef35eSSatish Balay       volatile unsigned long _argvec[3+5];                        \
28936edef35eSSatish Balay       volatile unsigned long _res;                                \
28946edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
28956edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
28966edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
28976edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
28986edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
28996edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
29006edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
29016edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
29026edef35eSSatish Balay       __asm__ volatile(                                           \
29036edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
29046edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
29056edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
29066edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
29076edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
29086edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
29096edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
29106edef35eSSatish Balay          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
29116edef35eSSatish Balay          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
29126edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
29136edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
29146edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
29156edef35eSSatish Balay          "mr %0,3\n\t"                                            \
29166edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
29176edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
29186edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
29196edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
29206edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
29216edef35eSSatish Balay       );                                                          \
29226edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
29236edef35eSSatish Balay    } while (0)
29246edef35eSSatish Balay 
29256edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
29266edef35eSSatish Balay    do {                                                           \
29276edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
29286edef35eSSatish Balay       volatile unsigned long _argvec[3+6];                        \
29296edef35eSSatish Balay       volatile unsigned long _res;                                \
29306edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
29316edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
29326edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
29336edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
29346edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
29356edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
29366edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
29376edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
29386edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
29396edef35eSSatish Balay       __asm__ volatile(                                           \
29406edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
29416edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
29426edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
29436edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
29446edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
29456edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
29466edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
29476edef35eSSatish Balay          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
29486edef35eSSatish Balay          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
29496edef35eSSatish Balay          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
29506edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
29516edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
29526edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
29536edef35eSSatish Balay          "mr %0,3\n\t"                                            \
29546edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
29556edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
29566edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
29576edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
29586edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
29596edef35eSSatish Balay       );                                                          \
29606edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
29616edef35eSSatish Balay    } while (0)
29626edef35eSSatish Balay 
29636edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
29646edef35eSSatish Balay                                  arg7)                            \
29656edef35eSSatish Balay    do {                                                           \
29666edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
29676edef35eSSatish Balay       volatile unsigned long _argvec[3+7];                        \
29686edef35eSSatish Balay       volatile unsigned long _res;                                \
29696edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
29706edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
29716edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
29726edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
29736edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
29746edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
29756edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
29766edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
29776edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
29786edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
29796edef35eSSatish Balay       __asm__ volatile(                                           \
29806edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
29816edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
29826edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
29836edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
29846edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
29856edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
29866edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
29876edef35eSSatish Balay          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
29886edef35eSSatish Balay          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
29896edef35eSSatish Balay          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
29906edef35eSSatish Balay          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
29916edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
29926edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
29936edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
29946edef35eSSatish Balay          "mr %0,3\n\t"                                            \
29956edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
29966edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
29976edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
29986edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
29996edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
30006edef35eSSatish Balay       );                                                          \
30016edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
30026edef35eSSatish Balay    } while (0)
30036edef35eSSatish Balay 
30046edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
30056edef35eSSatish Balay                                  arg7,arg8)                       \
30066edef35eSSatish Balay    do {                                                           \
30076edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
30086edef35eSSatish Balay       volatile unsigned long _argvec[3+8];                        \
30096edef35eSSatish Balay       volatile unsigned long _res;                                \
30106edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
30116edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
30126edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
30136edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
30146edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
30156edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
30166edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
30176edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
30186edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
30196edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
30206edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
30216edef35eSSatish Balay       __asm__ volatile(                                           \
30226edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
30236edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
30246edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
30256edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
30266edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
30276edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
30286edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
30296edef35eSSatish Balay          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
30306edef35eSSatish Balay          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
30316edef35eSSatish Balay          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
30326edef35eSSatish Balay          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
30336edef35eSSatish Balay          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
30346edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
30356edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
30366edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
30376edef35eSSatish Balay          "mr %0,3\n\t"                                            \
30386edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
30396edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
30406edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
30416edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
30426edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
30436edef35eSSatish Balay       );                                                          \
30446edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
30456edef35eSSatish Balay    } while (0)
30466edef35eSSatish Balay 
30476edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
30486edef35eSSatish Balay                                  arg7,arg8,arg9)                  \
30496edef35eSSatish Balay    do {                                                           \
30506edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
30516edef35eSSatish Balay       volatile unsigned long _argvec[3+9];                        \
30526edef35eSSatish Balay       volatile unsigned long _res;                                \
30536edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
30546edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
30556edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
30566edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
30576edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
30586edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
30596edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
30606edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
30616edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
30626edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
30636edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
30646edef35eSSatish Balay       _argvec[2+9] = (unsigned long)arg9;                         \
30656edef35eSSatish Balay       __asm__ volatile(                                           \
30666edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
30676edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
30686edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
30696edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
30706edef35eSSatish Balay          "addi 1,1,-128\n\t"  /* expand stack frame */            \
30716edef35eSSatish Balay          /* arg9 */                                               \
30726edef35eSSatish Balay          "ld  3,72(11)\n\t"                                       \
30736edef35eSSatish Balay          "std 3,112(1)\n\t"                                       \
30746edef35eSSatish Balay          /* args1-8 */                                            \
30756edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
30766edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
30776edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
30786edef35eSSatish Balay          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
30796edef35eSSatish Balay          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
30806edef35eSSatish Balay          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
30816edef35eSSatish Balay          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
30826edef35eSSatish Balay          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
30836edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
30846edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
30856edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
30866edef35eSSatish Balay          "mr %0,3\n\t"                                            \
30876edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
30886edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
30896edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
30906edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
30916edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
30926edef35eSSatish Balay       );                                                          \
30936edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
30946edef35eSSatish Balay    } while (0)
30956edef35eSSatish Balay 
30966edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
30976edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)           \
30986edef35eSSatish Balay    do {                                                           \
30996edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
31006edef35eSSatish Balay       volatile unsigned long _argvec[3+10];                       \
31016edef35eSSatish Balay       volatile unsigned long _res;                                \
31026edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
31036edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
31046edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
31056edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
31066edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
31076edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
31086edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
31096edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
31106edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
31116edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
31126edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
31136edef35eSSatish Balay       _argvec[2+9] = (unsigned long)arg9;                         \
31146edef35eSSatish Balay       _argvec[2+10] = (unsigned long)arg10;                       \
31156edef35eSSatish Balay       __asm__ volatile(                                           \
31166edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
31176edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
31186edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
31196edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
31206edef35eSSatish Balay          "addi 1,1,-128\n\t"  /* expand stack frame */            \
31216edef35eSSatish Balay          /* arg10 */                                              \
31226edef35eSSatish Balay          "ld  3,80(11)\n\t"                                       \
31236edef35eSSatish Balay          "std 3,120(1)\n\t"                                       \
31246edef35eSSatish Balay          /* arg9 */                                               \
31256edef35eSSatish Balay          "ld  3,72(11)\n\t"                                       \
31266edef35eSSatish Balay          "std 3,112(1)\n\t"                                       \
31276edef35eSSatish Balay          /* args1-8 */                                            \
31286edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
31296edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
31306edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
31316edef35eSSatish Balay          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
31326edef35eSSatish Balay          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
31336edef35eSSatish Balay          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
31346edef35eSSatish Balay          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
31356edef35eSSatish Balay          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
31366edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
31376edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
31386edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
31396edef35eSSatish Balay          "mr %0,3\n\t"                                            \
31406edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
31416edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
31426edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
31436edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
31446edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
31456edef35eSSatish Balay       );                                                          \
31466edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
31476edef35eSSatish Balay    } while (0)
31486edef35eSSatish Balay 
31496edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
31506edef35eSSatish Balay                                   arg7,arg8,arg9,arg10,arg11)     \
31516edef35eSSatish Balay    do {                                                           \
31526edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
31536edef35eSSatish Balay       volatile unsigned long _argvec[3+11];                       \
31546edef35eSSatish Balay       volatile unsigned long _res;                                \
31556edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
31566edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
31576edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
31586edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
31596edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
31606edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
31616edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
31626edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
31636edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
31646edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
31656edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
31666edef35eSSatish Balay       _argvec[2+9] = (unsigned long)arg9;                         \
31676edef35eSSatish Balay       _argvec[2+10] = (unsigned long)arg10;                       \
31686edef35eSSatish Balay       _argvec[2+11] = (unsigned long)arg11;                       \
31696edef35eSSatish Balay       __asm__ volatile(                                           \
31706edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
31716edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
31726edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
31736edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
31746edef35eSSatish Balay          "addi 1,1,-144\n\t"  /* expand stack frame */            \
31756edef35eSSatish Balay          /* arg11 */                                              \
31766edef35eSSatish Balay          "ld  3,88(11)\n\t"                                       \
31776edef35eSSatish Balay          "std 3,128(1)\n\t"                                       \
31786edef35eSSatish Balay          /* arg10 */                                              \
31796edef35eSSatish Balay          "ld  3,80(11)\n\t"                                       \
31806edef35eSSatish Balay          "std 3,120(1)\n\t"                                       \
31816edef35eSSatish Balay          /* arg9 */                                               \
31826edef35eSSatish Balay          "ld  3,72(11)\n\t"                                       \
31836edef35eSSatish Balay          "std 3,112(1)\n\t"                                       \
31846edef35eSSatish Balay          /* args1-8 */                                            \
31856edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
31866edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
31876edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
31886edef35eSSatish Balay          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
31896edef35eSSatish Balay          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
31906edef35eSSatish Balay          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
31916edef35eSSatish Balay          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
31926edef35eSSatish Balay          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
31936edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
31946edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
31956edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
31966edef35eSSatish Balay          "mr %0,3\n\t"                                            \
31976edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
31986edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
31996edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
32006edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
32016edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
32026edef35eSSatish Balay       );                                                          \
32036edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
32046edef35eSSatish Balay    } while (0)
32056edef35eSSatish Balay 
32066edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
32076edef35eSSatish Balay                                 arg7,arg8,arg9,arg10,arg11,arg12) \
32086edef35eSSatish Balay    do {                                                           \
32096edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
32106edef35eSSatish Balay       volatile unsigned long _argvec[3+12];                       \
32116edef35eSSatish Balay       volatile unsigned long _res;                                \
32126edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
32136edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
32146edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
32156edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
32166edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
32176edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
32186edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
32196edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
32206edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
32216edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
32226edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
32236edef35eSSatish Balay       _argvec[2+9] = (unsigned long)arg9;                         \
32246edef35eSSatish Balay       _argvec[2+10] = (unsigned long)arg10;                       \
32256edef35eSSatish Balay       _argvec[2+11] = (unsigned long)arg11;                       \
32266edef35eSSatish Balay       _argvec[2+12] = (unsigned long)arg12;                       \
32276edef35eSSatish Balay       __asm__ volatile(                                           \
32286edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
32296edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
32306edef35eSSatish Balay          "std 2,-16(11)\n\t"  /* save tocptr */                   \
32316edef35eSSatish Balay          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
32326edef35eSSatish Balay          "addi 1,1,-144\n\t"  /* expand stack frame */            \
32336edef35eSSatish Balay          /* arg12 */                                              \
32346edef35eSSatish Balay          "ld  3,96(11)\n\t"                                       \
32356edef35eSSatish Balay          "std 3,136(1)\n\t"                                       \
32366edef35eSSatish Balay          /* arg11 */                                              \
32376edef35eSSatish Balay          "ld  3,88(11)\n\t"                                       \
32386edef35eSSatish Balay          "std 3,128(1)\n\t"                                       \
32396edef35eSSatish Balay          /* arg10 */                                              \
32406edef35eSSatish Balay          "ld  3,80(11)\n\t"                                       \
32416edef35eSSatish Balay          "std 3,120(1)\n\t"                                       \
32426edef35eSSatish Balay          /* arg9 */                                               \
32436edef35eSSatish Balay          "ld  3,72(11)\n\t"                                       \
32446edef35eSSatish Balay          "std 3,112(1)\n\t"                                       \
32456edef35eSSatish Balay          /* args1-8 */                                            \
32466edef35eSSatish Balay          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
32476edef35eSSatish Balay          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
32486edef35eSSatish Balay          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
32496edef35eSSatish Balay          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
32506edef35eSSatish Balay          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
32516edef35eSSatish Balay          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
32526edef35eSSatish Balay          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
32536edef35eSSatish Balay          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
32546edef35eSSatish Balay          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
32556edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
32566edef35eSSatish Balay          "mr 11,%1\n\t"                                           \
32576edef35eSSatish Balay          "mr %0,3\n\t"                                            \
32586edef35eSSatish Balay          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
32596edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
32606edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
32616edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
32626edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
32636edef35eSSatish Balay       );                                                          \
32646edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
32656edef35eSSatish Balay    } while (0)
32666edef35eSSatish Balay 
32676edef35eSSatish Balay #endif /* PLAT_ppc64be_linux */
32686edef35eSSatish Balay 
32696edef35eSSatish Balay /* ------------------------- ppc64le-linux ----------------------- */
32706edef35eSSatish Balay #if defined(PLAT_ppc64le_linux)
32716edef35eSSatish Balay 
32726edef35eSSatish Balay /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
32736edef35eSSatish Balay 
32746edef35eSSatish Balay /* These regs are trashed by the hidden call. */
32756edef35eSSatish Balay #define __CALLER_SAVED_REGS                                       \
32766edef35eSSatish Balay    "lr", "ctr", "xer",                                            \
32776edef35eSSatish Balay    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
32786edef35eSSatish Balay    "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",         \
32796edef35eSSatish Balay    "r11", "r12", "r13"
32806edef35eSSatish Balay 
32816edef35eSSatish Balay /* Macros to save and align the stack before making a function
32826edef35eSSatish Balay    call and restore it afterwards as gcc may not keep the stack
32836edef35eSSatish Balay    pointer aligned if it doesn't realise calls are being made
32846edef35eSSatish Balay    to other functions. */
32856edef35eSSatish Balay 
32866edef35eSSatish Balay #define VALGRIND_ALIGN_STACK               \
32876edef35eSSatish Balay       "mr 28,1\n\t"                        \
32886edef35eSSatish Balay       "rldicr 1,1,0,59\n\t"
32896edef35eSSatish Balay #define VALGRIND_RESTORE_STACK             \
32906edef35eSSatish Balay       "mr 1,28\n\t"
32916edef35eSSatish Balay 
32926edef35eSSatish Balay /* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
32936edef35eSSatish Balay    long) == 8. */
32946edef35eSSatish Balay 
32956edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                   \
32966edef35eSSatish Balay    do {                                                           \
32976edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
32986edef35eSSatish Balay       volatile unsigned long _argvec[3+0];                        \
32996edef35eSSatish Balay       volatile unsigned long _res;                                \
33006edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
33016edef35eSSatish Balay       _argvec[1] = (unsigned long)_orig.r2;                       \
33026edef35eSSatish Balay       _argvec[2] = (unsigned long)_orig.nraddr;                   \
33036edef35eSSatish Balay       __asm__ volatile(                                           \
33046edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
33056edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
33066edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
33076edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
33086edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
33096edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
33106edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
33116edef35eSSatish Balay          "mr %0,3\n\t"                                            \
33126edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
33136edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
33146edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
33156edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
33166edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
33176edef35eSSatish Balay       );                                                          \
33186edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
33196edef35eSSatish Balay    } while (0)
33206edef35eSSatish Balay 
33216edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                             \
33226edef35eSSatish Balay    do {                                                           \
33236edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
33246edef35eSSatish Balay       volatile unsigned long _argvec[3+1];                        \
33256edef35eSSatish Balay       volatile unsigned long _res;                                \
33266edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
33276edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
33286edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
33296edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
33306edef35eSSatish Balay       __asm__ volatile(                                           \
33316edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
33326edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
33336edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
33346edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
33356edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
33366edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
33376edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
33386edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
33396edef35eSSatish Balay          "mr %0,3\n\t"                                            \
33406edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
33416edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
33426edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
33436edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
33446edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
33456edef35eSSatish Balay       );                                                          \
33466edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
33476edef35eSSatish Balay    } while (0)
33486edef35eSSatish Balay 
33496edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
33506edef35eSSatish Balay    do {                                                           \
33516edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
33526edef35eSSatish Balay       volatile unsigned long _argvec[3+2];                        \
33536edef35eSSatish Balay       volatile unsigned long _res;                                \
33546edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
33556edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
33566edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
33576edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
33586edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
33596edef35eSSatish Balay       __asm__ volatile(                                           \
33606edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
33616edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
33626edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
33636edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
33646edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
33656edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
33666edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
33676edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
33686edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
33696edef35eSSatish Balay          "mr %0,3\n\t"                                            \
33706edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
33716edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
33726edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
33736edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
33746edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
33756edef35eSSatish Balay       );                                                          \
33766edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
33776edef35eSSatish Balay    } while (0)
33786edef35eSSatish Balay 
33796edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
33806edef35eSSatish Balay    do {                                                           \
33816edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
33826edef35eSSatish Balay       volatile unsigned long _argvec[3+3];                        \
33836edef35eSSatish Balay       volatile unsigned long _res;                                \
33846edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
33856edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
33866edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
33876edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
33886edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
33896edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
33906edef35eSSatish Balay       __asm__ volatile(                                           \
33916edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
33926edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
33936edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
33946edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
33956edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
33966edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
33976edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
33986edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
33996edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
34006edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
34016edef35eSSatish Balay          "mr %0,3\n\t"                                            \
34026edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
34036edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
34046edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
34056edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
34066edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
34076edef35eSSatish Balay       );                                                          \
34086edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
34096edef35eSSatish Balay    } while (0)
34106edef35eSSatish Balay 
34116edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
34126edef35eSSatish Balay    do {                                                           \
34136edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
34146edef35eSSatish Balay       volatile unsigned long _argvec[3+4];                        \
34156edef35eSSatish Balay       volatile unsigned long _res;                                \
34166edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
34176edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
34186edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
34196edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
34206edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
34216edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
34226edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
34236edef35eSSatish Balay       __asm__ volatile(                                           \
34246edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
34256edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
34266edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
34276edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
34286edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
34296edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
34306edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
34316edef35eSSatish Balay          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
34326edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
34336edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
34346edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
34356edef35eSSatish Balay          "mr %0,3\n\t"                                            \
34366edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
34376edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
34386edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
34396edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
34406edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
34416edef35eSSatish Balay       );                                                          \
34426edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
34436edef35eSSatish Balay    } while (0)
34446edef35eSSatish Balay 
34456edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
34466edef35eSSatish Balay    do {                                                           \
34476edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
34486edef35eSSatish Balay       volatile unsigned long _argvec[3+5];                        \
34496edef35eSSatish Balay       volatile unsigned long _res;                                \
34506edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
34516edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
34526edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
34536edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
34546edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
34556edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
34566edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
34576edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
34586edef35eSSatish Balay       __asm__ volatile(                                           \
34596edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
34606edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
34616edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
34626edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
34636edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
34646edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
34656edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
34666edef35eSSatish Balay          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
34676edef35eSSatish Balay          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
34686edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
34696edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
34706edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
34716edef35eSSatish Balay          "mr %0,3\n\t"                                            \
34726edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
34736edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
34746edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
34756edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
34766edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
34776edef35eSSatish Balay       );                                                          \
34786edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
34796edef35eSSatish Balay    } while (0)
34806edef35eSSatish Balay 
34816edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
34826edef35eSSatish Balay    do {                                                           \
34836edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
34846edef35eSSatish Balay       volatile unsigned long _argvec[3+6];                        \
34856edef35eSSatish Balay       volatile unsigned long _res;                                \
34866edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
34876edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
34886edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
34896edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
34906edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
34916edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
34926edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
34936edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
34946edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
34956edef35eSSatish Balay       __asm__ volatile(                                           \
34966edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
34976edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
34986edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
34996edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
35006edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
35016edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
35026edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
35036edef35eSSatish Balay          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
35046edef35eSSatish Balay          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
35056edef35eSSatish Balay          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
35066edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
35076edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
35086edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
35096edef35eSSatish Balay          "mr %0,3\n\t"                                            \
35106edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
35116edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
35126edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
35136edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
35146edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
35156edef35eSSatish Balay       );                                                          \
35166edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
35176edef35eSSatish Balay    } while (0)
35186edef35eSSatish Balay 
35196edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
35206edef35eSSatish Balay                                  arg7)                            \
35216edef35eSSatish Balay    do {                                                           \
35226edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
35236edef35eSSatish Balay       volatile unsigned long _argvec[3+7];                        \
35246edef35eSSatish Balay       volatile unsigned long _res;                                \
35256edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
35266edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
35276edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
35286edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
35296edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
35306edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
35316edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
35326edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
35336edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
35346edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
35356edef35eSSatish Balay       __asm__ volatile(                                           \
35366edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
35376edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
35386edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
35396edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
35406edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
35416edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
35426edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
35436edef35eSSatish Balay          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
35446edef35eSSatish Balay          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
35456edef35eSSatish Balay          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
35466edef35eSSatish Balay          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
35476edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
35486edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
35496edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
35506edef35eSSatish Balay          "mr %0,3\n\t"                                            \
35516edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
35526edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
35536edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
35546edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
35556edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
35566edef35eSSatish Balay       );                                                          \
35576edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
35586edef35eSSatish Balay    } while (0)
35596edef35eSSatish Balay 
35606edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
35616edef35eSSatish Balay                                  arg7,arg8)                       \
35626edef35eSSatish Balay    do {                                                           \
35636edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
35646edef35eSSatish Balay       volatile unsigned long _argvec[3+8];                        \
35656edef35eSSatish Balay       volatile unsigned long _res;                                \
35666edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
35676edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
35686edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
35696edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
35706edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
35716edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
35726edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
35736edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
35746edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
35756edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
35766edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
35776edef35eSSatish Balay       __asm__ volatile(                                           \
35786edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
35796edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
35806edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
35816edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
35826edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
35836edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
35846edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
35856edef35eSSatish Balay          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
35866edef35eSSatish Balay          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
35876edef35eSSatish Balay          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
35886edef35eSSatish Balay          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
35896edef35eSSatish Balay          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
35906edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
35916edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
35926edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
35936edef35eSSatish Balay          "mr %0,3\n\t"                                            \
35946edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
35956edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
35966edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
35976edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
35986edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
35996edef35eSSatish Balay       );                                                          \
36006edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
36016edef35eSSatish Balay    } while (0)
36026edef35eSSatish Balay 
36036edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
36046edef35eSSatish Balay                                  arg7,arg8,arg9)                  \
36056edef35eSSatish Balay    do {                                                           \
36066edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
36076edef35eSSatish Balay       volatile unsigned long _argvec[3+9];                        \
36086edef35eSSatish Balay       volatile unsigned long _res;                                \
36096edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
36106edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
36116edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
36126edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
36136edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
36146edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
36156edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
36166edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
36176edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
36186edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
36196edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
36206edef35eSSatish Balay       _argvec[2+9] = (unsigned long)arg9;                         \
36216edef35eSSatish Balay       __asm__ volatile(                                           \
36226edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
36236edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
36246edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
36256edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
36266edef35eSSatish Balay          "addi 1,1,-128\n\t"  /* expand stack frame */            \
36276edef35eSSatish Balay          /* arg9 */                                               \
36286edef35eSSatish Balay          "ld  3,72(12)\n\t"                                       \
36296edef35eSSatish Balay          "std 3,96(1)\n\t"                                        \
36306edef35eSSatish Balay          /* args1-8 */                                            \
36316edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
36326edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
36336edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
36346edef35eSSatish Balay          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
36356edef35eSSatish Balay          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
36366edef35eSSatish Balay          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
36376edef35eSSatish Balay          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
36386edef35eSSatish Balay          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
36396edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
36406edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
36416edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
36426edef35eSSatish Balay          "mr %0,3\n\t"                                            \
36436edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
36446edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
36456edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
36466edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
36476edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
36486edef35eSSatish Balay       );                                                          \
36496edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
36506edef35eSSatish Balay    } while (0)
36516edef35eSSatish Balay 
36526edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
36536edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)           \
36546edef35eSSatish Balay    do {                                                           \
36556edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
36566edef35eSSatish Balay       volatile unsigned long _argvec[3+10];                       \
36576edef35eSSatish Balay       volatile unsigned long _res;                                \
36586edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
36596edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
36606edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
36616edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
36626edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
36636edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
36646edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
36656edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
36666edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
36676edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
36686edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
36696edef35eSSatish Balay       _argvec[2+9] = (unsigned long)arg9;                         \
36706edef35eSSatish Balay       _argvec[2+10] = (unsigned long)arg10;                       \
36716edef35eSSatish Balay       __asm__ volatile(                                           \
36726edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
36736edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
36746edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
36756edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
36766edef35eSSatish Balay          "addi 1,1,-128\n\t"  /* expand stack frame */            \
36776edef35eSSatish Balay          /* arg10 */                                              \
36786edef35eSSatish Balay          "ld  3,80(12)\n\t"                                       \
36796edef35eSSatish Balay          "std 3,104(1)\n\t"                                       \
36806edef35eSSatish Balay          /* arg9 */                                               \
36816edef35eSSatish Balay          "ld  3,72(12)\n\t"                                       \
36826edef35eSSatish Balay          "std 3,96(1)\n\t"                                        \
36836edef35eSSatish Balay          /* args1-8 */                                            \
36846edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
36856edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
36866edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
36876edef35eSSatish Balay          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
36886edef35eSSatish Balay          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
36896edef35eSSatish Balay          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
36906edef35eSSatish Balay          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
36916edef35eSSatish Balay          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
36926edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
36936edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
36946edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
36956edef35eSSatish Balay          "mr %0,3\n\t"                                            \
36966edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
36976edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
36986edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
36996edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
37006edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
37016edef35eSSatish Balay       );                                                          \
37026edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
37036edef35eSSatish Balay    } while (0)
37046edef35eSSatish Balay 
37056edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
37066edef35eSSatish Balay                                   arg7,arg8,arg9,arg10,arg11)     \
37076edef35eSSatish Balay    do {                                                           \
37086edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
37096edef35eSSatish Balay       volatile unsigned long _argvec[3+11];                       \
37106edef35eSSatish Balay       volatile unsigned long _res;                                \
37116edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
37126edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
37136edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
37146edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
37156edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
37166edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
37176edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
37186edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
37196edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
37206edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
37216edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
37226edef35eSSatish Balay       _argvec[2+9] = (unsigned long)arg9;                         \
37236edef35eSSatish Balay       _argvec[2+10] = (unsigned long)arg10;                       \
37246edef35eSSatish Balay       _argvec[2+11] = (unsigned long)arg11;                       \
37256edef35eSSatish Balay       __asm__ volatile(                                           \
37266edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
37276edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
37286edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
37296edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
37306edef35eSSatish Balay          "addi 1,1,-144\n\t"  /* expand stack frame */            \
37316edef35eSSatish Balay          /* arg11 */                                              \
37326edef35eSSatish Balay          "ld  3,88(12)\n\t"                                       \
37336edef35eSSatish Balay          "std 3,112(1)\n\t"                                       \
37346edef35eSSatish Balay          /* arg10 */                                              \
37356edef35eSSatish Balay          "ld  3,80(12)\n\t"                                       \
37366edef35eSSatish Balay          "std 3,104(1)\n\t"                                       \
37376edef35eSSatish Balay          /* arg9 */                                               \
37386edef35eSSatish Balay          "ld  3,72(12)\n\t"                                       \
37396edef35eSSatish Balay          "std 3,96(1)\n\t"                                        \
37406edef35eSSatish Balay          /* args1-8 */                                            \
37416edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
37426edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
37436edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
37446edef35eSSatish Balay          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
37456edef35eSSatish Balay          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
37466edef35eSSatish Balay          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
37476edef35eSSatish Balay          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
37486edef35eSSatish Balay          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
37496edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
37506edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
37516edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
37526edef35eSSatish Balay          "mr %0,3\n\t"                                            \
37536edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
37546edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
37556edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
37566edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
37576edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
37586edef35eSSatish Balay       );                                                          \
37596edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
37606edef35eSSatish Balay    } while (0)
37616edef35eSSatish Balay 
37626edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
37636edef35eSSatish Balay                                 arg7,arg8,arg9,arg10,arg11,arg12) \
37646edef35eSSatish Balay    do {                                                           \
37656edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
37666edef35eSSatish Balay       volatile unsigned long _argvec[3+12];                       \
37676edef35eSSatish Balay       volatile unsigned long _res;                                \
37686edef35eSSatish Balay       /* _argvec[0] holds current r2 across the call */           \
37696edef35eSSatish Balay       _argvec[1]   = (unsigned long)_orig.r2;                     \
37706edef35eSSatish Balay       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
37716edef35eSSatish Balay       _argvec[2+1] = (unsigned long)arg1;                         \
37726edef35eSSatish Balay       _argvec[2+2] = (unsigned long)arg2;                         \
37736edef35eSSatish Balay       _argvec[2+3] = (unsigned long)arg3;                         \
37746edef35eSSatish Balay       _argvec[2+4] = (unsigned long)arg4;                         \
37756edef35eSSatish Balay       _argvec[2+5] = (unsigned long)arg5;                         \
37766edef35eSSatish Balay       _argvec[2+6] = (unsigned long)arg6;                         \
37776edef35eSSatish Balay       _argvec[2+7] = (unsigned long)arg7;                         \
37786edef35eSSatish Balay       _argvec[2+8] = (unsigned long)arg8;                         \
37796edef35eSSatish Balay       _argvec[2+9] = (unsigned long)arg9;                         \
37806edef35eSSatish Balay       _argvec[2+10] = (unsigned long)arg10;                       \
37816edef35eSSatish Balay       _argvec[2+11] = (unsigned long)arg11;                       \
37826edef35eSSatish Balay       _argvec[2+12] = (unsigned long)arg12;                       \
37836edef35eSSatish Balay       __asm__ volatile(                                           \
37846edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
37856edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
37866edef35eSSatish Balay          "std 2,-16(12)\n\t"  /* save tocptr */                   \
37876edef35eSSatish Balay          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
37886edef35eSSatish Balay          "addi 1,1,-144\n\t"  /* expand stack frame */            \
37896edef35eSSatish Balay          /* arg12 */                                              \
37906edef35eSSatish Balay          "ld  3,96(12)\n\t"                                       \
37916edef35eSSatish Balay          "std 3,120(1)\n\t"                                       \
37926edef35eSSatish Balay          /* arg11 */                                              \
37936edef35eSSatish Balay          "ld  3,88(12)\n\t"                                       \
37946edef35eSSatish Balay          "std 3,112(1)\n\t"                                       \
37956edef35eSSatish Balay          /* arg10 */                                              \
37966edef35eSSatish Balay          "ld  3,80(12)\n\t"                                       \
37976edef35eSSatish Balay          "std 3,104(1)\n\t"                                       \
37986edef35eSSatish Balay          /* arg9 */                                               \
37996edef35eSSatish Balay          "ld  3,72(12)\n\t"                                       \
38006edef35eSSatish Balay          "std 3,96(1)\n\t"                                        \
38016edef35eSSatish Balay          /* args1-8 */                                            \
38026edef35eSSatish Balay          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
38036edef35eSSatish Balay          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
38046edef35eSSatish Balay          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
38056edef35eSSatish Balay          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
38066edef35eSSatish Balay          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
38076edef35eSSatish Balay          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
38086edef35eSSatish Balay          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
38096edef35eSSatish Balay          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
38106edef35eSSatish Balay          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
38116edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
38126edef35eSSatish Balay          "mr 12,%1\n\t"                                           \
38136edef35eSSatish Balay          "mr %0,3\n\t"                                            \
38146edef35eSSatish Balay          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
38156edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
38166edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
38176edef35eSSatish Balay          : /*in*/    "r" (&_argvec[2])                            \
38186edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
38196edef35eSSatish Balay       );                                                          \
38206edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
38216edef35eSSatish Balay    } while (0)
38226edef35eSSatish Balay 
38236edef35eSSatish Balay #endif /* PLAT_ppc64le_linux */
38246edef35eSSatish Balay 
38256edef35eSSatish Balay /* ------------------------- arm-linux ------------------------- */
38266edef35eSSatish Balay 
38276edef35eSSatish Balay #if defined(PLAT_arm_linux)
38286edef35eSSatish Balay 
38296edef35eSSatish Balay /* These regs are trashed by the hidden call. */
38306edef35eSSatish Balay #define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4", "r12", "r14"
38316edef35eSSatish Balay 
38326edef35eSSatish Balay /* Macros to save and align the stack before making a function
38336edef35eSSatish Balay    call and restore it afterwards as gcc may not keep the stack
38346edef35eSSatish Balay    pointer aligned if it doesn't realise calls are being made
38356edef35eSSatish Balay    to other functions. */
38366edef35eSSatish Balay 
38376edef35eSSatish Balay /* This is a bit tricky.  We store the original stack pointer in r10
38386edef35eSSatish Balay    as it is callee-saves.  gcc doesn't allow the use of r11 for some
38396edef35eSSatish Balay    reason.  Also, we can't directly "bic" the stack pointer in thumb
38406edef35eSSatish Balay    mode since r13 isn't an allowed register number in that context.
38416edef35eSSatish Balay    So use r4 as a temporary, since that is about to get trashed
38426edef35eSSatish Balay    anyway, just after each use of this macro.  Side effect is we need
38436edef35eSSatish Balay    to be very careful about any future changes, since
38446edef35eSSatish Balay    VALGRIND_ALIGN_STACK simply assumes r4 is usable. */
38456edef35eSSatish Balay #define VALGRIND_ALIGN_STACK               \
38466edef35eSSatish Balay       "mov r10, sp\n\t"                    \
38476edef35eSSatish Balay       "mov r4,  sp\n\t"                    \
38486edef35eSSatish Balay       "bic r4,  r4, #7\n\t"                \
38496edef35eSSatish Balay       "mov sp,  r4\n\t"
38506edef35eSSatish Balay #define VALGRIND_RESTORE_STACK             \
38516edef35eSSatish Balay       "mov sp,  r10\n\t"
38526edef35eSSatish Balay 
38536edef35eSSatish Balay /* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned
38546edef35eSSatish Balay    long) == 4. */
38556edef35eSSatish Balay 
38566edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                   \
38576edef35eSSatish Balay    do {                                                           \
38586edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
38596edef35eSSatish Balay       volatile unsigned long _argvec[1];                          \
38606edef35eSSatish Balay       volatile unsigned long _res;                                \
38616edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
38626edef35eSSatish Balay       __asm__ volatile(                                           \
38636edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
38646edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
38656edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
38666edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
38676edef35eSSatish Balay          "mov %0, r0\n"                                           \
38686edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
38696edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
38706edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
38716edef35eSSatish Balay       );                                                          \
38726edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
38736edef35eSSatish Balay    } while (0)
38746edef35eSSatish Balay 
38756edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                             \
38766edef35eSSatish Balay    do {                                                           \
38776edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
38786edef35eSSatish Balay       volatile unsigned long _argvec[2];                          \
38796edef35eSSatish Balay       volatile unsigned long _res;                                \
38806edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
38816edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
38826edef35eSSatish Balay       __asm__ volatile(                                           \
38836edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
38846edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
38856edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
38866edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
38876edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
38886edef35eSSatish Balay          "mov %0, r0\n"                                           \
38896edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
38906edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
38916edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
38926edef35eSSatish Balay       );                                                          \
38936edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
38946edef35eSSatish Balay    } while (0)
38956edef35eSSatish Balay 
38966edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
38976edef35eSSatish Balay    do {                                                           \
38986edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
38996edef35eSSatish Balay       volatile unsigned long _argvec[3];                          \
39006edef35eSSatish Balay       volatile unsigned long _res;                                \
39016edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
39026edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
39036edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
39046edef35eSSatish Balay       __asm__ volatile(                                           \
39056edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
39066edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
39076edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
39086edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
39096edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
39106edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
39116edef35eSSatish Balay          "mov %0, r0\n"                                           \
39126edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
39136edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
39146edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
39156edef35eSSatish Balay       );                                                          \
39166edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
39176edef35eSSatish Balay    } while (0)
39186edef35eSSatish Balay 
39196edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
39206edef35eSSatish Balay    do {                                                           \
39216edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
39226edef35eSSatish Balay       volatile unsigned long _argvec[4];                          \
39236edef35eSSatish Balay       volatile unsigned long _res;                                \
39246edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
39256edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
39266edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
39276edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
39286edef35eSSatish Balay       __asm__ volatile(                                           \
39296edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
39306edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
39316edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
39326edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
39336edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
39346edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
39356edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
39366edef35eSSatish Balay          "mov %0, r0\n"                                           \
39376edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
39386edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
39396edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
39406edef35eSSatish Balay       );                                                          \
39416edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
39426edef35eSSatish Balay    } while (0)
39436edef35eSSatish Balay 
39446edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
39456edef35eSSatish Balay    do {                                                           \
39466edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
39476edef35eSSatish Balay       volatile unsigned long _argvec[5];                          \
39486edef35eSSatish Balay       volatile unsigned long _res;                                \
39496edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
39506edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
39516edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
39526edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
39536edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
39546edef35eSSatish Balay       __asm__ volatile(                                           \
39556edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
39566edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
39576edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
39586edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
39596edef35eSSatish Balay          "ldr r3, [%1, #16] \n\t"                                 \
39606edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
39616edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
39626edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
39636edef35eSSatish Balay          "mov %0, r0"                                             \
39646edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
39656edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
39666edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
39676edef35eSSatish Balay       );                                                          \
39686edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
39696edef35eSSatish Balay    } while (0)
39706edef35eSSatish Balay 
39716edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
39726edef35eSSatish Balay    do {                                                           \
39736edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
39746edef35eSSatish Balay       volatile unsigned long _argvec[6];                          \
39756edef35eSSatish Balay       volatile unsigned long _res;                                \
39766edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
39776edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
39786edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
39796edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
39806edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
39816edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
39826edef35eSSatish Balay       __asm__ volatile(                                           \
39836edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
39846edef35eSSatish Balay          "sub sp, sp, #4 \n\t"                                    \
39856edef35eSSatish Balay          "ldr r0, [%1, #20] \n\t"                                 \
39866edef35eSSatish Balay          "push {r0} \n\t"                                         \
39876edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
39886edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
39896edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
39906edef35eSSatish Balay          "ldr r3, [%1, #16] \n\t"                                 \
39916edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
39926edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
39936edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
39946edef35eSSatish Balay          "mov %0, r0"                                             \
39956edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
39966edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
39976edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
39986edef35eSSatish Balay       );                                                          \
39996edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
40006edef35eSSatish Balay    } while (0)
40016edef35eSSatish Balay 
40026edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
40036edef35eSSatish Balay    do {                                                           \
40046edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
40056edef35eSSatish Balay       volatile unsigned long _argvec[7];                          \
40066edef35eSSatish Balay       volatile unsigned long _res;                                \
40076edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
40086edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
40096edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
40106edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
40116edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
40126edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
40136edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
40146edef35eSSatish Balay       __asm__ volatile(                                           \
40156edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
40166edef35eSSatish Balay          "ldr r0, [%1, #20] \n\t"                                 \
40176edef35eSSatish Balay          "ldr r1, [%1, #24] \n\t"                                 \
40186edef35eSSatish Balay          "push {r0, r1} \n\t"                                     \
40196edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
40206edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
40216edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
40226edef35eSSatish Balay          "ldr r3, [%1, #16] \n\t"                                 \
40236edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
40246edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
40256edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
40266edef35eSSatish Balay          "mov %0, r0"                                             \
40276edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
40286edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
40296edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
40306edef35eSSatish Balay       );                                                          \
40316edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
40326edef35eSSatish Balay    } while (0)
40336edef35eSSatish Balay 
40346edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
40356edef35eSSatish Balay                                  arg7)                            \
40366edef35eSSatish Balay    do {                                                           \
40376edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
40386edef35eSSatish Balay       volatile unsigned long _argvec[8];                          \
40396edef35eSSatish Balay       volatile unsigned long _res;                                \
40406edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
40416edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
40426edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
40436edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
40446edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
40456edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
40466edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
40476edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
40486edef35eSSatish Balay       __asm__ volatile(                                           \
40496edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
40506edef35eSSatish Balay          "sub sp, sp, #4 \n\t"                                    \
40516edef35eSSatish Balay          "ldr r0, [%1, #20] \n\t"                                 \
40526edef35eSSatish Balay          "ldr r1, [%1, #24] \n\t"                                 \
40536edef35eSSatish Balay          "ldr r2, [%1, #28] \n\t"                                 \
40546edef35eSSatish Balay          "push {r0, r1, r2} \n\t"                                 \
40556edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
40566edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
40576edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
40586edef35eSSatish Balay          "ldr r3, [%1, #16] \n\t"                                 \
40596edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
40606edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
40616edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
40626edef35eSSatish Balay          "mov %0, r0"                                             \
40636edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
40646edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
40656edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
40666edef35eSSatish Balay       );                                                          \
40676edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
40686edef35eSSatish Balay    } while (0)
40696edef35eSSatish Balay 
40706edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
40716edef35eSSatish Balay                                  arg7,arg8)                       \
40726edef35eSSatish Balay    do {                                                           \
40736edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
40746edef35eSSatish Balay       volatile unsigned long _argvec[9];                          \
40756edef35eSSatish Balay       volatile unsigned long _res;                                \
40766edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
40776edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
40786edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
40796edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
40806edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
40816edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
40826edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
40836edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
40846edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
40856edef35eSSatish Balay       __asm__ volatile(                                           \
40866edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
40876edef35eSSatish Balay          "ldr r0, [%1, #20] \n\t"                                 \
40886edef35eSSatish Balay          "ldr r1, [%1, #24] \n\t"                                 \
40896edef35eSSatish Balay          "ldr r2, [%1, #28] \n\t"                                 \
40906edef35eSSatish Balay          "ldr r3, [%1, #32] \n\t"                                 \
40916edef35eSSatish Balay          "push {r0, r1, r2, r3} \n\t"                             \
40926edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
40936edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
40946edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
40956edef35eSSatish Balay          "ldr r3, [%1, #16] \n\t"                                 \
40966edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
40976edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
40986edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
40996edef35eSSatish Balay          "mov %0, r0"                                             \
41006edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
41016edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
41026edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
41036edef35eSSatish Balay       );                                                          \
41046edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
41056edef35eSSatish Balay    } while (0)
41066edef35eSSatish Balay 
41076edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
41086edef35eSSatish Balay                                  arg7,arg8,arg9)                  \
41096edef35eSSatish Balay    do {                                                           \
41106edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
41116edef35eSSatish Balay       volatile unsigned long _argvec[10];                         \
41126edef35eSSatish Balay       volatile unsigned long _res;                                \
41136edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
41146edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
41156edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
41166edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
41176edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
41186edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
41196edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
41206edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
41216edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
41226edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
41236edef35eSSatish Balay       __asm__ volatile(                                           \
41246edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
41256edef35eSSatish Balay          "sub sp, sp, #4 \n\t"                                    \
41266edef35eSSatish Balay          "ldr r0, [%1, #20] \n\t"                                 \
41276edef35eSSatish Balay          "ldr r1, [%1, #24] \n\t"                                 \
41286edef35eSSatish Balay          "ldr r2, [%1, #28] \n\t"                                 \
41296edef35eSSatish Balay          "ldr r3, [%1, #32] \n\t"                                 \
41306edef35eSSatish Balay          "ldr r4, [%1, #36] \n\t"                                 \
41316edef35eSSatish Balay          "push {r0, r1, r2, r3, r4} \n\t"                         \
41326edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
41336edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
41346edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
41356edef35eSSatish Balay          "ldr r3, [%1, #16] \n\t"                                 \
41366edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
41376edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
41386edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
41396edef35eSSatish Balay          "mov %0, r0"                                             \
41406edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
41416edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
41426edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
41436edef35eSSatish Balay       );                                                          \
41446edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
41456edef35eSSatish Balay    } while (0)
41466edef35eSSatish Balay 
41476edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
41486edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)           \
41496edef35eSSatish Balay    do {                                                           \
41506edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
41516edef35eSSatish Balay       volatile unsigned long _argvec[11];                         \
41526edef35eSSatish Balay       volatile unsigned long _res;                                \
41536edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
41546edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
41556edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
41566edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
41576edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
41586edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
41596edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
41606edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
41616edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
41626edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
41636edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
41646edef35eSSatish Balay       __asm__ volatile(                                           \
41656edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
41666edef35eSSatish Balay          "ldr r0, [%1, #40] \n\t"                                 \
41676edef35eSSatish Balay          "push {r0} \n\t"                                         \
41686edef35eSSatish Balay          "ldr r0, [%1, #20] \n\t"                                 \
41696edef35eSSatish Balay          "ldr r1, [%1, #24] \n\t"                                 \
41706edef35eSSatish Balay          "ldr r2, [%1, #28] \n\t"                                 \
41716edef35eSSatish Balay          "ldr r3, [%1, #32] \n\t"                                 \
41726edef35eSSatish Balay          "ldr r4, [%1, #36] \n\t"                                 \
41736edef35eSSatish Balay          "push {r0, r1, r2, r3, r4} \n\t"                         \
41746edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
41756edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
41766edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
41776edef35eSSatish Balay          "ldr r3, [%1, #16] \n\t"                                 \
41786edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
41796edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
41806edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
41816edef35eSSatish Balay          "mov %0, r0"                                             \
41826edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
41836edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
41846edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
41856edef35eSSatish Balay       );                                                          \
41866edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
41876edef35eSSatish Balay    } while (0)
41886edef35eSSatish Balay 
41896edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
41906edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
41916edef35eSSatish Balay                                   arg11)                          \
41926edef35eSSatish Balay    do {                                                           \
41936edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
41946edef35eSSatish Balay       volatile unsigned long _argvec[12];                         \
41956edef35eSSatish Balay       volatile unsigned long _res;                                \
41966edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
41976edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
41986edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
41996edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
42006edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
42016edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
42026edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
42036edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
42046edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
42056edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
42066edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
42076edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
42086edef35eSSatish Balay       __asm__ volatile(                                           \
42096edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
42106edef35eSSatish Balay          "sub sp, sp, #4 \n\t"                                    \
42116edef35eSSatish Balay          "ldr r0, [%1, #40] \n\t"                                 \
42126edef35eSSatish Balay          "ldr r1, [%1, #44] \n\t"                                 \
42136edef35eSSatish Balay          "push {r0, r1} \n\t"                                     \
42146edef35eSSatish Balay          "ldr r0, [%1, #20] \n\t"                                 \
42156edef35eSSatish Balay          "ldr r1, [%1, #24] \n\t"                                 \
42166edef35eSSatish Balay          "ldr r2, [%1, #28] \n\t"                                 \
42176edef35eSSatish Balay          "ldr r3, [%1, #32] \n\t"                                 \
42186edef35eSSatish Balay          "ldr r4, [%1, #36] \n\t"                                 \
42196edef35eSSatish Balay          "push {r0, r1, r2, r3, r4} \n\t"                         \
42206edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
42216edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
42226edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
42236edef35eSSatish Balay          "ldr r3, [%1, #16] \n\t"                                 \
42246edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
42256edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
42266edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
42276edef35eSSatish Balay          "mov %0, r0"                                             \
42286edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
42296edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
42306edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
42316edef35eSSatish Balay       );                                                          \
42326edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
42336edef35eSSatish Balay    } while (0)
42346edef35eSSatish Balay 
42356edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
42366edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
42376edef35eSSatish Balay                                   arg11,arg12)                    \
42386edef35eSSatish Balay    do {                                                           \
42396edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
42406edef35eSSatish Balay       volatile unsigned long _argvec[13];                         \
42416edef35eSSatish Balay       volatile unsigned long _res;                                \
42426edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
42436edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
42446edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
42456edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
42466edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
42476edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
42486edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
42496edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
42506edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
42516edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
42526edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
42536edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
42546edef35eSSatish Balay       _argvec[12] = (unsigned long)(arg12);                       \
42556edef35eSSatish Balay       __asm__ volatile(                                           \
42566edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
42576edef35eSSatish Balay          "ldr r0, [%1, #40] \n\t"                                 \
42586edef35eSSatish Balay          "ldr r1, [%1, #44] \n\t"                                 \
42596edef35eSSatish Balay          "ldr r2, [%1, #48] \n\t"                                 \
42606edef35eSSatish Balay          "push {r0, r1, r2} \n\t"                                 \
42616edef35eSSatish Balay          "ldr r0, [%1, #20] \n\t"                                 \
42626edef35eSSatish Balay          "ldr r1, [%1, #24] \n\t"                                 \
42636edef35eSSatish Balay          "ldr r2, [%1, #28] \n\t"                                 \
42646edef35eSSatish Balay          "ldr r3, [%1, #32] \n\t"                                 \
42656edef35eSSatish Balay          "ldr r4, [%1, #36] \n\t"                                 \
42666edef35eSSatish Balay          "push {r0, r1, r2, r3, r4} \n\t"                         \
42676edef35eSSatish Balay          "ldr r0, [%1, #4] \n\t"                                  \
42686edef35eSSatish Balay          "ldr r1, [%1, #8] \n\t"                                  \
42696edef35eSSatish Balay          "ldr r2, [%1, #12] \n\t"                                 \
42706edef35eSSatish Balay          "ldr r3, [%1, #16] \n\t"                                 \
42716edef35eSSatish Balay          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
42726edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
42736edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
42746edef35eSSatish Balay          "mov %0, r0"                                             \
42756edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
42766edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
42776edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
42786edef35eSSatish Balay       );                                                          \
42796edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
42806edef35eSSatish Balay    } while (0)
42816edef35eSSatish Balay 
42826edef35eSSatish Balay #endif /* PLAT_arm_linux */
42836edef35eSSatish Balay 
42846edef35eSSatish Balay /* ------------------------ arm64-linux ------------------------ */
42856edef35eSSatish Balay 
42866edef35eSSatish Balay #if defined(PLAT_arm64_linux)
42876edef35eSSatish Balay 
42886edef35eSSatish Balay /* These regs are trashed by the hidden call. */
42896edef35eSSatish Balay #define __CALLER_SAVED_REGS \
42906edef35eSSatish Balay      "x0", "x1", "x2", "x3","x4", "x5", "x6", "x7", "x8", "x9",   \
42916edef35eSSatish Balay      "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17",      \
42926edef35eSSatish Balay      "x18", "x19", "x20", "x30",                                  \
42936edef35eSSatish Balay      "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9",  \
42946edef35eSSatish Balay      "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17",      \
42956edef35eSSatish Balay      "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25",      \
42966edef35eSSatish Balay      "v26", "v27", "v28", "v29", "v30", "v31"
42976edef35eSSatish Balay 
42986edef35eSSatish Balay /* x21 is callee-saved, so we can use it to save and restore SP around
42996edef35eSSatish Balay    the hidden call. */
43006edef35eSSatish Balay #define VALGRIND_ALIGN_STACK               \
43016edef35eSSatish Balay       "mov x21, sp\n\t"                    \
43026edef35eSSatish Balay       "bic sp, x21, #15\n\t"
43036edef35eSSatish Balay #define VALGRIND_RESTORE_STACK             \
43046edef35eSSatish Balay       "mov sp,  x21\n\t"
43056edef35eSSatish Balay 
43066edef35eSSatish Balay /* These CALL_FN_ macros assume that on arm64-linux,
43076edef35eSSatish Balay    sizeof(unsigned long) == 8. */
43086edef35eSSatish Balay 
43096edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                   \
43106edef35eSSatish Balay    do {                                                           \
43116edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
43126edef35eSSatish Balay       volatile unsigned long _argvec[1];                          \
43136edef35eSSatish Balay       volatile unsigned long _res;                                \
43146edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
43156edef35eSSatish Balay       __asm__ volatile(                                           \
43166edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
43176edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
43186edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
43196edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
43206edef35eSSatish Balay          "mov %0, x0\n"                                           \
43216edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
43226edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
43236edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
43246edef35eSSatish Balay       );                                                          \
43256edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
43266edef35eSSatish Balay    } while (0)
43276edef35eSSatish Balay 
43286edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                             \
43296edef35eSSatish Balay    do {                                                           \
43306edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
43316edef35eSSatish Balay       volatile unsigned long _argvec[2];                          \
43326edef35eSSatish Balay       volatile unsigned long _res;                                \
43336edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
43346edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
43356edef35eSSatish Balay       __asm__ volatile(                                           \
43366edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
43376edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
43386edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
43396edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
43406edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
43416edef35eSSatish Balay          "mov %0, x0\n"                                           \
43426edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
43436edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
43446edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
43456edef35eSSatish Balay       );                                                          \
43466edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
43476edef35eSSatish Balay    } while (0)
43486edef35eSSatish Balay 
43496edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
43506edef35eSSatish Balay    do {                                                           \
43516edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
43526edef35eSSatish Balay       volatile unsigned long _argvec[3];                          \
43536edef35eSSatish Balay       volatile unsigned long _res;                                \
43546edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
43556edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
43566edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
43576edef35eSSatish Balay       __asm__ volatile(                                           \
43586edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
43596edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
43606edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
43616edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
43626edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
43636edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
43646edef35eSSatish Balay          "mov %0, x0\n"                                           \
43656edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
43666edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
43676edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
43686edef35eSSatish Balay       );                                                          \
43696edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
43706edef35eSSatish Balay    } while (0)
43716edef35eSSatish Balay 
43726edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
43736edef35eSSatish Balay    do {                                                           \
43746edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
43756edef35eSSatish Balay       volatile unsigned long _argvec[4];                          \
43766edef35eSSatish Balay       volatile unsigned long _res;                                \
43776edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
43786edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
43796edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
43806edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
43816edef35eSSatish Balay       __asm__ volatile(                                           \
43826edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
43836edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
43846edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
43856edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
43866edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
43876edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
43886edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
43896edef35eSSatish Balay          "mov %0, x0\n"                                           \
43906edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
43916edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
43926edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
43936edef35eSSatish Balay       );                                                          \
43946edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
43956edef35eSSatish Balay    } while (0)
43966edef35eSSatish Balay 
43976edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
43986edef35eSSatish Balay    do {                                                           \
43996edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
44006edef35eSSatish Balay       volatile unsigned long _argvec[5];                          \
44016edef35eSSatish Balay       volatile unsigned long _res;                                \
44026edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
44036edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
44046edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
44056edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
44066edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
44076edef35eSSatish Balay       __asm__ volatile(                                           \
44086edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
44096edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
44106edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
44116edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
44126edef35eSSatish Balay          "ldr x3, [%1, #32] \n\t"                                 \
44136edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
44146edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
44156edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
44166edef35eSSatish Balay          "mov %0, x0"                                             \
44176edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
44186edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
44196edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
44206edef35eSSatish Balay       );                                                          \
44216edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
44226edef35eSSatish Balay    } while (0)
44236edef35eSSatish Balay 
44246edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
44256edef35eSSatish Balay    do {                                                           \
44266edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
44276edef35eSSatish Balay       volatile unsigned long _argvec[6];                          \
44286edef35eSSatish Balay       volatile unsigned long _res;                                \
44296edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
44306edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
44316edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
44326edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
44336edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
44346edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
44356edef35eSSatish Balay       __asm__ volatile(                                           \
44366edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
44376edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
44386edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
44396edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
44406edef35eSSatish Balay          "ldr x3, [%1, #32] \n\t"                                 \
44416edef35eSSatish Balay          "ldr x4, [%1, #40] \n\t"                                 \
44426edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
44436edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
44446edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
44456edef35eSSatish Balay          "mov %0, x0"                                             \
44466edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
44476edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
44486edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
44496edef35eSSatish Balay       );                                                          \
44506edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
44516edef35eSSatish Balay    } while (0)
44526edef35eSSatish Balay 
44536edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
44546edef35eSSatish Balay    do {                                                           \
44556edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
44566edef35eSSatish Balay       volatile unsigned long _argvec[7];                          \
44576edef35eSSatish Balay       volatile unsigned long _res;                                \
44586edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
44596edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
44606edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
44616edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
44626edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
44636edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
44646edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
44656edef35eSSatish Balay       __asm__ volatile(                                           \
44666edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
44676edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
44686edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
44696edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
44706edef35eSSatish Balay          "ldr x3, [%1, #32] \n\t"                                 \
44716edef35eSSatish Balay          "ldr x4, [%1, #40] \n\t"                                 \
44726edef35eSSatish Balay          "ldr x5, [%1, #48] \n\t"                                 \
44736edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
44746edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
44756edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
44766edef35eSSatish Balay          "mov %0, x0"                                             \
44776edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
44786edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
44796edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
44806edef35eSSatish Balay       );                                                          \
44816edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
44826edef35eSSatish Balay    } while (0)
44836edef35eSSatish Balay 
44846edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
44856edef35eSSatish Balay                                  arg7)                            \
44866edef35eSSatish Balay    do {                                                           \
44876edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
44886edef35eSSatish Balay       volatile unsigned long _argvec[8];                          \
44896edef35eSSatish Balay       volatile unsigned long _res;                                \
44906edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
44916edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
44926edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
44936edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
44946edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
44956edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
44966edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
44976edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
44986edef35eSSatish Balay       __asm__ volatile(                                           \
44996edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
45006edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
45016edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
45026edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
45036edef35eSSatish Balay          "ldr x3, [%1, #32] \n\t"                                 \
45046edef35eSSatish Balay          "ldr x4, [%1, #40] \n\t"                                 \
45056edef35eSSatish Balay          "ldr x5, [%1, #48] \n\t"                                 \
45066edef35eSSatish Balay          "ldr x6, [%1, #56] \n\t"                                 \
45076edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
45086edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
45096edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
45106edef35eSSatish Balay          "mov %0, x0"                                             \
45116edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
45126edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
45136edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
45146edef35eSSatish Balay       );                                                          \
45156edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
45166edef35eSSatish Balay    } while (0)
45176edef35eSSatish Balay 
45186edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
45196edef35eSSatish Balay                                  arg7,arg8)                       \
45206edef35eSSatish Balay    do {                                                           \
45216edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
45226edef35eSSatish Balay       volatile unsigned long _argvec[9];                          \
45236edef35eSSatish Balay       volatile unsigned long _res;                                \
45246edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
45256edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
45266edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
45276edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
45286edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
45296edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
45306edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
45316edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
45326edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
45336edef35eSSatish Balay       __asm__ volatile(                                           \
45346edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
45356edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
45366edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
45376edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
45386edef35eSSatish Balay          "ldr x3, [%1, #32] \n\t"                                 \
45396edef35eSSatish Balay          "ldr x4, [%1, #40] \n\t"                                 \
45406edef35eSSatish Balay          "ldr x5, [%1, #48] \n\t"                                 \
45416edef35eSSatish Balay          "ldr x6, [%1, #56] \n\t"                                 \
45426edef35eSSatish Balay          "ldr x7, [%1, #64] \n\t"                                 \
45436edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
45446edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
45456edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
45466edef35eSSatish Balay          "mov %0, x0"                                             \
45476edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
45486edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
45496edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
45506edef35eSSatish Balay       );                                                          \
45516edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
45526edef35eSSatish Balay    } while (0)
45536edef35eSSatish Balay 
45546edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
45556edef35eSSatish Balay                                  arg7,arg8,arg9)                  \
45566edef35eSSatish Balay    do {                                                           \
45576edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
45586edef35eSSatish Balay       volatile unsigned long _argvec[10];                         \
45596edef35eSSatish Balay       volatile unsigned long _res;                                \
45606edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
45616edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
45626edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
45636edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
45646edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
45656edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
45666edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
45676edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
45686edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
45696edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
45706edef35eSSatish Balay       __asm__ volatile(                                           \
45716edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
45726edef35eSSatish Balay          "sub sp, sp, #0x20 \n\t"                                 \
45736edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
45746edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
45756edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
45766edef35eSSatish Balay          "ldr x3, [%1, #32] \n\t"                                 \
45776edef35eSSatish Balay          "ldr x4, [%1, #40] \n\t"                                 \
45786edef35eSSatish Balay          "ldr x5, [%1, #48] \n\t"                                 \
45796edef35eSSatish Balay          "ldr x6, [%1, #56] \n\t"                                 \
45806edef35eSSatish Balay          "ldr x7, [%1, #64] \n\t"                                 \
45816edef35eSSatish Balay          "ldr x8, [%1, #72] \n\t"                                 \
45826edef35eSSatish Balay          "str x8, [sp, #0]  \n\t"                                 \
45836edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
45846edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
45856edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
45866edef35eSSatish Balay          "mov %0, x0"                                             \
45876edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
45886edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
45896edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
45906edef35eSSatish Balay       );                                                          \
45916edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
45926edef35eSSatish Balay    } while (0)
45936edef35eSSatish Balay 
45946edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
45956edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)           \
45966edef35eSSatish Balay    do {                                                           \
45976edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
45986edef35eSSatish Balay       volatile unsigned long _argvec[11];                         \
45996edef35eSSatish Balay       volatile unsigned long _res;                                \
46006edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
46016edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
46026edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
46036edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
46046edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
46056edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
46066edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
46076edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
46086edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
46096edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
46106edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
46116edef35eSSatish Balay       __asm__ volatile(                                           \
46126edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
46136edef35eSSatish Balay          "sub sp, sp, #0x20 \n\t"                                 \
46146edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
46156edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
46166edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
46176edef35eSSatish Balay          "ldr x3, [%1, #32] \n\t"                                 \
46186edef35eSSatish Balay          "ldr x4, [%1, #40] \n\t"                                 \
46196edef35eSSatish Balay          "ldr x5, [%1, #48] \n\t"                                 \
46206edef35eSSatish Balay          "ldr x6, [%1, #56] \n\t"                                 \
46216edef35eSSatish Balay          "ldr x7, [%1, #64] \n\t"                                 \
46226edef35eSSatish Balay          "ldr x8, [%1, #72] \n\t"                                 \
46236edef35eSSatish Balay          "str x8, [sp, #0]  \n\t"                                 \
46246edef35eSSatish Balay          "ldr x8, [%1, #80] \n\t"                                 \
46256edef35eSSatish Balay          "str x8, [sp, #8]  \n\t"                                 \
46266edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
46276edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
46286edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
46296edef35eSSatish Balay          "mov %0, x0"                                             \
46306edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
46316edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
46326edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
46336edef35eSSatish Balay       );                                                          \
46346edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
46356edef35eSSatish Balay    } while (0)
46366edef35eSSatish Balay 
46376edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
46386edef35eSSatish Balay                                   arg7,arg8,arg9,arg10,arg11)     \
46396edef35eSSatish Balay    do {                                                           \
46406edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
46416edef35eSSatish Balay       volatile unsigned long _argvec[12];                         \
46426edef35eSSatish Balay       volatile unsigned long _res;                                \
46436edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
46446edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
46456edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
46466edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
46476edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
46486edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
46496edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
46506edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
46516edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
46526edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
46536edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
46546edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
46556edef35eSSatish Balay       __asm__ volatile(                                           \
46566edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
46576edef35eSSatish Balay          "sub sp, sp, #0x30 \n\t"                                 \
46586edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
46596edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
46606edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
46616edef35eSSatish Balay          "ldr x3, [%1, #32] \n\t"                                 \
46626edef35eSSatish Balay          "ldr x4, [%1, #40] \n\t"                                 \
46636edef35eSSatish Balay          "ldr x5, [%1, #48] \n\t"                                 \
46646edef35eSSatish Balay          "ldr x6, [%1, #56] \n\t"                                 \
46656edef35eSSatish Balay          "ldr x7, [%1, #64] \n\t"                                 \
46666edef35eSSatish Balay          "ldr x8, [%1, #72] \n\t"                                 \
46676edef35eSSatish Balay          "str x8, [sp, #0]  \n\t"                                 \
46686edef35eSSatish Balay          "ldr x8, [%1, #80] \n\t"                                 \
46696edef35eSSatish Balay          "str x8, [sp, #8]  \n\t"                                 \
46706edef35eSSatish Balay          "ldr x8, [%1, #88] \n\t"                                 \
46716edef35eSSatish Balay          "str x8, [sp, #16] \n\t"                                 \
46726edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
46736edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
46746edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
46756edef35eSSatish Balay          "mov %0, x0"                                             \
46766edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
46776edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
46786edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
46796edef35eSSatish Balay       );                                                          \
46806edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
46816edef35eSSatish Balay    } while (0)
46826edef35eSSatish Balay 
46836edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
46846edef35eSSatish Balay                                   arg7,arg8,arg9,arg10,arg11,     \
46856edef35eSSatish Balay                                   arg12)                          \
46866edef35eSSatish Balay    do {                                                           \
46876edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
46886edef35eSSatish Balay       volatile unsigned long _argvec[13];                         \
46896edef35eSSatish Balay       volatile unsigned long _res;                                \
46906edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
46916edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
46926edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
46936edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
46946edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
46956edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
46966edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
46976edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
46986edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
46996edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
47006edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
47016edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
47026edef35eSSatish Balay       _argvec[12] = (unsigned long)(arg12);                       \
47036edef35eSSatish Balay       __asm__ volatile(                                           \
47046edef35eSSatish Balay          VALGRIND_ALIGN_STACK                                     \
47056edef35eSSatish Balay          "sub sp, sp, #0x30 \n\t"                                 \
47066edef35eSSatish Balay          "ldr x0, [%1, #8] \n\t"                                  \
47076edef35eSSatish Balay          "ldr x1, [%1, #16] \n\t"                                 \
47086edef35eSSatish Balay          "ldr x2, [%1, #24] \n\t"                                 \
47096edef35eSSatish Balay          "ldr x3, [%1, #32] \n\t"                                 \
47106edef35eSSatish Balay          "ldr x4, [%1, #40] \n\t"                                 \
47116edef35eSSatish Balay          "ldr x5, [%1, #48] \n\t"                                 \
47126edef35eSSatish Balay          "ldr x6, [%1, #56] \n\t"                                 \
47136edef35eSSatish Balay          "ldr x7, [%1, #64] \n\t"                                 \
47146edef35eSSatish Balay          "ldr x8, [%1, #72] \n\t"                                 \
47156edef35eSSatish Balay          "str x8, [sp, #0]  \n\t"                                 \
47166edef35eSSatish Balay          "ldr x8, [%1, #80] \n\t"                                 \
47176edef35eSSatish Balay          "str x8, [sp, #8]  \n\t"                                 \
47186edef35eSSatish Balay          "ldr x8, [%1, #88] \n\t"                                 \
47196edef35eSSatish Balay          "str x8, [sp, #16] \n\t"                                 \
47206edef35eSSatish Balay          "ldr x8, [%1, #96] \n\t"                                 \
47216edef35eSSatish Balay          "str x8, [sp, #24] \n\t"                                 \
47226edef35eSSatish Balay          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
47236edef35eSSatish Balay          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
47246edef35eSSatish Balay          VALGRIND_RESTORE_STACK                                   \
47256edef35eSSatish Balay          "mov %0, x0"                                             \
47266edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
47276edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
47286edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
47296edef35eSSatish Balay       );                                                          \
47306edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
47316edef35eSSatish Balay    } while (0)
47326edef35eSSatish Balay 
47336edef35eSSatish Balay #endif /* PLAT_arm64_linux */
47346edef35eSSatish Balay 
47356edef35eSSatish Balay /* ------------------------- s390x-linux ------------------------- */
47366edef35eSSatish Balay 
47376edef35eSSatish Balay #if defined(PLAT_s390x_linux)
47386edef35eSSatish Balay 
47396edef35eSSatish Balay /* Similar workaround as amd64 (see above), but we use r11 as frame
47406edef35eSSatish Balay    pointer and save the old r11 in r7. r11 might be used for
47416edef35eSSatish Balay    argvec, therefore we copy argvec in r1 since r1 is clobbered
47426edef35eSSatish Balay    after the call anyway.  */
47436edef35eSSatish Balay #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
47446edef35eSSatish Balay #  define __FRAME_POINTER                                         \
47456edef35eSSatish Balay       ,"d"(__builtin_dwarf_cfa())
47466edef35eSSatish Balay #  define VALGRIND_CFI_PROLOGUE                                   \
47476edef35eSSatish Balay       ".cfi_remember_state\n\t"                                   \
47486edef35eSSatish Balay       "lgr 1,%1\n\t" /* copy the argvec pointer in r1 */          \
47496edef35eSSatish Balay       "lgr 7,11\n\t"                                              \
47506edef35eSSatish Balay       "lgr 11,%2\n\t"                                             \
47516edef35eSSatish Balay       ".cfi_def_cfa r11, 0\n\t"
47526edef35eSSatish Balay #  define VALGRIND_CFI_EPILOGUE                                   \
47536edef35eSSatish Balay       "lgr 11, 7\n\t"                                             \
47546edef35eSSatish Balay       ".cfi_restore_state\n\t"
47556edef35eSSatish Balay #else
47566edef35eSSatish Balay #  define __FRAME_POINTER
47576edef35eSSatish Balay #  define VALGRIND_CFI_PROLOGUE                                   \
47586edef35eSSatish Balay       "lgr 1,%1\n\t"
47596edef35eSSatish Balay #  define VALGRIND_CFI_EPILOGUE
47606edef35eSSatish Balay #endif
47616edef35eSSatish Balay 
47626edef35eSSatish Balay /* Nb: On s390 the stack pointer is properly aligned *at all times*
47636edef35eSSatish Balay    according to the s390 GCC maintainer. (The ABI specification is not
47646edef35eSSatish Balay    precise in this regard.) Therefore, VALGRIND_ALIGN_STACK and
47656edef35eSSatish Balay    VALGRIND_RESTORE_STACK are not defined here. */
47666edef35eSSatish Balay 
47676edef35eSSatish Balay /* These regs are trashed by the hidden call. Note that we overwrite
47686edef35eSSatish Balay    r14 in s390_irgen_noredir (VEX/priv/guest_s390_irgen.c) to give the
47696edef35eSSatish Balay    function a proper return address. All others are ABI defined call
47706edef35eSSatish Balay    clobbers. */
47716edef35eSSatish Balay #if defined(__VX__) || defined(__S390_VX__)
47726edef35eSSatish Balay #define __CALLER_SAVED_REGS "0", "1", "2", "3", "4", "5", "14",   \
47736edef35eSSatish Balay       "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",             \
47746edef35eSSatish Balay       "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",       \
47756edef35eSSatish Balay       "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",     \
47766edef35eSSatish Balay       "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
47776edef35eSSatish Balay #else
47786edef35eSSatish Balay #define __CALLER_SAVED_REGS "0", "1", "2", "3", "4", "5", "14",   \
47796edef35eSSatish Balay       "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7"
47806edef35eSSatish Balay #endif
47816edef35eSSatish Balay 
47826edef35eSSatish Balay /* Nb: Although r11 is modified in the asm snippets below (inside
47836edef35eSSatish Balay    VALGRIND_CFI_PROLOGUE) it is not listed in the clobber section, for
47846edef35eSSatish Balay    two reasons:
47856edef35eSSatish Balay    (1) r11 is restored in VALGRIND_CFI_EPILOGUE, so effectively it is not
47866edef35eSSatish Balay        modified
47876edef35eSSatish Balay    (2) GCC will complain that r11 cannot appear inside a clobber section,
47886edef35eSSatish Balay        when compiled with -O -fno-omit-frame-pointer
47896edef35eSSatish Balay  */
47906edef35eSSatish Balay 
47916edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                  \
47926edef35eSSatish Balay    do {                                                          \
47936edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
47946edef35eSSatish Balay       volatile unsigned long  _argvec[1];                        \
47956edef35eSSatish Balay       volatile unsigned long _res;                               \
47966edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
47976edef35eSSatish Balay       __asm__ volatile(                                          \
47986edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
47996edef35eSSatish Balay          "aghi 15,-160\n\t"                                      \
48006edef35eSSatish Balay          "lg 1, 0(1)\n\t"  /* target->r1 */                      \
48016edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
48026edef35eSSatish Balay          "aghi 15,160\n\t"                                       \
48036edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
48046edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
48056edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
48066edef35eSSatish Balay          : /*in*/    "d" (&_argvec[0]) __FRAME_POINTER           \
48076edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
48086edef35eSSatish Balay       );                                                         \
48096edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
48106edef35eSSatish Balay    } while (0)
48116edef35eSSatish Balay 
48126edef35eSSatish Balay /* The call abi has the arguments in r2-r6 and stack */
48136edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                            \
48146edef35eSSatish Balay    do {                                                          \
48156edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
48166edef35eSSatish Balay       volatile unsigned long _argvec[2];                         \
48176edef35eSSatish Balay       volatile unsigned long _res;                               \
48186edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
48196edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
48206edef35eSSatish Balay       __asm__ volatile(                                          \
48216edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
48226edef35eSSatish Balay          "aghi 15,-160\n\t"                                      \
48236edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
48246edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
48256edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
48266edef35eSSatish Balay          "aghi 15,160\n\t"                                       \
48276edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
48286edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
48296edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
48306edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
48316edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
48326edef35eSSatish Balay       );                                                         \
48336edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
48346edef35eSSatish Balay    } while (0)
48356edef35eSSatish Balay 
48366edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1, arg2)                     \
48376edef35eSSatish Balay    do {                                                          \
48386edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
48396edef35eSSatish Balay       volatile unsigned long _argvec[3];                         \
48406edef35eSSatish Balay       volatile unsigned long _res;                               \
48416edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
48426edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
48436edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
48446edef35eSSatish Balay       __asm__ volatile(                                          \
48456edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
48466edef35eSSatish Balay          "aghi 15,-160\n\t"                                      \
48476edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
48486edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
48496edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
48506edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
48516edef35eSSatish Balay          "aghi 15,160\n\t"                                       \
48526edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
48536edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
48546edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
48556edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
48566edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
48576edef35eSSatish Balay       );                                                         \
48586edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
48596edef35eSSatish Balay    } while (0)
48606edef35eSSatish Balay 
48616edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3)              \
48626edef35eSSatish Balay    do {                                                          \
48636edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
48646edef35eSSatish Balay       volatile unsigned long _argvec[4];                         \
48656edef35eSSatish Balay       volatile unsigned long _res;                               \
48666edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
48676edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
48686edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
48696edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
48706edef35eSSatish Balay       __asm__ volatile(                                          \
48716edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
48726edef35eSSatish Balay          "aghi 15,-160\n\t"                                      \
48736edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
48746edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
48756edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
48766edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
48776edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
48786edef35eSSatish Balay          "aghi 15,160\n\t"                                       \
48796edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
48806edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
48816edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
48826edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
48836edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
48846edef35eSSatish Balay       );                                                         \
48856edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
48866edef35eSSatish Balay    } while (0)
48876edef35eSSatish Balay 
48886edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4)       \
48896edef35eSSatish Balay    do {                                                          \
48906edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
48916edef35eSSatish Balay       volatile unsigned long _argvec[5];                         \
48926edef35eSSatish Balay       volatile unsigned long _res;                               \
48936edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
48946edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
48956edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
48966edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
48976edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                          \
48986edef35eSSatish Balay       __asm__ volatile(                                          \
48996edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
49006edef35eSSatish Balay          "aghi 15,-160\n\t"                                      \
49016edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
49026edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
49036edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
49046edef35eSSatish Balay          "lg 5,32(1)\n\t"                                        \
49056edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
49066edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
49076edef35eSSatish Balay          "aghi 15,160\n\t"                                       \
49086edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
49096edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
49106edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
49116edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
49126edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
49136edef35eSSatish Balay       );                                                         \
49146edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
49156edef35eSSatish Balay    } while (0)
49166edef35eSSatish Balay 
49176edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5)   \
49186edef35eSSatish Balay    do {                                                          \
49196edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
49206edef35eSSatish Balay       volatile unsigned long _argvec[6];                         \
49216edef35eSSatish Balay       volatile unsigned long _res;                               \
49226edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
49236edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
49246edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
49256edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
49266edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                          \
49276edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                          \
49286edef35eSSatish Balay       __asm__ volatile(                                          \
49296edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
49306edef35eSSatish Balay          "aghi 15,-160\n\t"                                      \
49316edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
49326edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
49336edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
49346edef35eSSatish Balay          "lg 5,32(1)\n\t"                                        \
49356edef35eSSatish Balay          "lg 6,40(1)\n\t"                                        \
49366edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
49376edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
49386edef35eSSatish Balay          "aghi 15,160\n\t"                                       \
49396edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
49406edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
49416edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
49426edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
49436edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
49446edef35eSSatish Balay       );                                                         \
49456edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
49466edef35eSSatish Balay    } while (0)
49476edef35eSSatish Balay 
49486edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
49496edef35eSSatish Balay                      arg6)                                       \
49506edef35eSSatish Balay    do {                                                          \
49516edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
49526edef35eSSatish Balay       volatile unsigned long _argvec[7];                         \
49536edef35eSSatish Balay       volatile unsigned long _res;                               \
49546edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
49556edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
49566edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
49576edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
49586edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                          \
49596edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                          \
49606edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                          \
49616edef35eSSatish Balay       __asm__ volatile(                                          \
49626edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
49636edef35eSSatish Balay          "aghi 15,-168\n\t"                                      \
49646edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
49656edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
49666edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
49676edef35eSSatish Balay          "lg 5,32(1)\n\t"                                        \
49686edef35eSSatish Balay          "lg 6,40(1)\n\t"                                        \
49696edef35eSSatish Balay          "mvc 160(8,15), 48(1)\n\t"                              \
49706edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
49716edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
49726edef35eSSatish Balay          "aghi 15,168\n\t"                                       \
49736edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
49746edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
49756edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
49766edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
49776edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
49786edef35eSSatish Balay       );                                                         \
49796edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
49806edef35eSSatish Balay    } while (0)
49816edef35eSSatish Balay 
49826edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
49836edef35eSSatish Balay                      arg6, arg7)                                 \
49846edef35eSSatish Balay    do {                                                          \
49856edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
49866edef35eSSatish Balay       volatile unsigned long _argvec[8];                         \
49876edef35eSSatish Balay       volatile unsigned long _res;                               \
49886edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
49896edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
49906edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
49916edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
49926edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                          \
49936edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                          \
49946edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                          \
49956edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                          \
49966edef35eSSatish Balay       __asm__ volatile(                                          \
49976edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
49986edef35eSSatish Balay          "aghi 15,-176\n\t"                                      \
49996edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
50006edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
50016edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
50026edef35eSSatish Balay          "lg 5,32(1)\n\t"                                        \
50036edef35eSSatish Balay          "lg 6,40(1)\n\t"                                        \
50046edef35eSSatish Balay          "mvc 160(8,15), 48(1)\n\t"                              \
50056edef35eSSatish Balay          "mvc 168(8,15), 56(1)\n\t"                              \
50066edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
50076edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
50086edef35eSSatish Balay          "aghi 15,176\n\t"                                       \
50096edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
50106edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
50116edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
50126edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
50136edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
50146edef35eSSatish Balay       );                                                         \
50156edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
50166edef35eSSatish Balay    } while (0)
50176edef35eSSatish Balay 
50186edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
50196edef35eSSatish Balay                      arg6, arg7 ,arg8)                           \
50206edef35eSSatish Balay    do {                                                          \
50216edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
50226edef35eSSatish Balay       volatile unsigned long _argvec[9];                         \
50236edef35eSSatish Balay       volatile unsigned long _res;                               \
50246edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
50256edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
50266edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
50276edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
50286edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                          \
50296edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                          \
50306edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                          \
50316edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                          \
50326edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                          \
50336edef35eSSatish Balay       __asm__ volatile(                                          \
50346edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
50356edef35eSSatish Balay          "aghi 15,-184\n\t"                                      \
50366edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
50376edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
50386edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
50396edef35eSSatish Balay          "lg 5,32(1)\n\t"                                        \
50406edef35eSSatish Balay          "lg 6,40(1)\n\t"                                        \
50416edef35eSSatish Balay          "mvc 160(8,15), 48(1)\n\t"                              \
50426edef35eSSatish Balay          "mvc 168(8,15), 56(1)\n\t"                              \
50436edef35eSSatish Balay          "mvc 176(8,15), 64(1)\n\t"                              \
50446edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
50456edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
50466edef35eSSatish Balay          "aghi 15,184\n\t"                                       \
50476edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
50486edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
50496edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
50506edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
50516edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
50526edef35eSSatish Balay       );                                                         \
50536edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
50546edef35eSSatish Balay    } while (0)
50556edef35eSSatish Balay 
50566edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
50576edef35eSSatish Balay                      arg6, arg7 ,arg8, arg9)                     \
50586edef35eSSatish Balay    do {                                                          \
50596edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
50606edef35eSSatish Balay       volatile unsigned long _argvec[10];                        \
50616edef35eSSatish Balay       volatile unsigned long _res;                               \
50626edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
50636edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
50646edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
50656edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
50666edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                          \
50676edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                          \
50686edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                          \
50696edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                          \
50706edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                          \
50716edef35eSSatish Balay       _argvec[9] = (unsigned long)arg9;                          \
50726edef35eSSatish Balay       __asm__ volatile(                                          \
50736edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
50746edef35eSSatish Balay          "aghi 15,-192\n\t"                                      \
50756edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
50766edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
50776edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
50786edef35eSSatish Balay          "lg 5,32(1)\n\t"                                        \
50796edef35eSSatish Balay          "lg 6,40(1)\n\t"                                        \
50806edef35eSSatish Balay          "mvc 160(8,15), 48(1)\n\t"                              \
50816edef35eSSatish Balay          "mvc 168(8,15), 56(1)\n\t"                              \
50826edef35eSSatish Balay          "mvc 176(8,15), 64(1)\n\t"                              \
50836edef35eSSatish Balay          "mvc 184(8,15), 72(1)\n\t"                              \
50846edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
50856edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
50866edef35eSSatish Balay          "aghi 15,192\n\t"                                       \
50876edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
50886edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
50896edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
50906edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
50916edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
50926edef35eSSatish Balay       );                                                         \
50936edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
50946edef35eSSatish Balay    } while (0)
50956edef35eSSatish Balay 
50966edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5,  \
50976edef35eSSatish Balay                      arg6, arg7 ,arg8, arg9, arg10)              \
50986edef35eSSatish Balay    do {                                                          \
50996edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
51006edef35eSSatish Balay       volatile unsigned long _argvec[11];                        \
51016edef35eSSatish Balay       volatile unsigned long _res;                               \
51026edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
51036edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
51046edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
51056edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
51066edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                          \
51076edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                          \
51086edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                          \
51096edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                          \
51106edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                          \
51116edef35eSSatish Balay       _argvec[9] = (unsigned long)arg9;                          \
51126edef35eSSatish Balay       _argvec[10] = (unsigned long)arg10;                        \
51136edef35eSSatish Balay       __asm__ volatile(                                          \
51146edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
51156edef35eSSatish Balay          "aghi 15,-200\n\t"                                      \
51166edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
51176edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
51186edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
51196edef35eSSatish Balay          "lg 5,32(1)\n\t"                                        \
51206edef35eSSatish Balay          "lg 6,40(1)\n\t"                                        \
51216edef35eSSatish Balay          "mvc 160(8,15), 48(1)\n\t"                              \
51226edef35eSSatish Balay          "mvc 168(8,15), 56(1)\n\t"                              \
51236edef35eSSatish Balay          "mvc 176(8,15), 64(1)\n\t"                              \
51246edef35eSSatish Balay          "mvc 184(8,15), 72(1)\n\t"                              \
51256edef35eSSatish Balay          "mvc 192(8,15), 80(1)\n\t"                              \
51266edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
51276edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
51286edef35eSSatish Balay          "aghi 15,200\n\t"                                       \
51296edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
51306edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
51316edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
51326edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
51336edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
51346edef35eSSatish Balay       );                                                         \
51356edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
51366edef35eSSatish Balay    } while (0)
51376edef35eSSatish Balay 
51386edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5,  \
51396edef35eSSatish Balay                      arg6, arg7 ,arg8, arg9, arg10, arg11)       \
51406edef35eSSatish Balay    do {                                                          \
51416edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
51426edef35eSSatish Balay       volatile unsigned long _argvec[12];                        \
51436edef35eSSatish Balay       volatile unsigned long _res;                               \
51446edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
51456edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
51466edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
51476edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
51486edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                          \
51496edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                          \
51506edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                          \
51516edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                          \
51526edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                          \
51536edef35eSSatish Balay       _argvec[9] = (unsigned long)arg9;                          \
51546edef35eSSatish Balay       _argvec[10] = (unsigned long)arg10;                        \
51556edef35eSSatish Balay       _argvec[11] = (unsigned long)arg11;                        \
51566edef35eSSatish Balay       __asm__ volatile(                                          \
51576edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
51586edef35eSSatish Balay          "aghi 15,-208\n\t"                                      \
51596edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
51606edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
51616edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
51626edef35eSSatish Balay          "lg 5,32(1)\n\t"                                        \
51636edef35eSSatish Balay          "lg 6,40(1)\n\t"                                        \
51646edef35eSSatish Balay          "mvc 160(8,15), 48(1)\n\t"                              \
51656edef35eSSatish Balay          "mvc 168(8,15), 56(1)\n\t"                              \
51666edef35eSSatish Balay          "mvc 176(8,15), 64(1)\n\t"                              \
51676edef35eSSatish Balay          "mvc 184(8,15), 72(1)\n\t"                              \
51686edef35eSSatish Balay          "mvc 192(8,15), 80(1)\n\t"                              \
51696edef35eSSatish Balay          "mvc 200(8,15), 88(1)\n\t"                              \
51706edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
51716edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
51726edef35eSSatish Balay          "aghi 15,208\n\t"                                       \
51736edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
51746edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
51756edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
51766edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
51776edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
51786edef35eSSatish Balay       );                                                         \
51796edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
51806edef35eSSatish Balay    } while (0)
51816edef35eSSatish Balay 
51826edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5,  \
51836edef35eSSatish Balay                      arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\
51846edef35eSSatish Balay    do {                                                          \
51856edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                     \
51866edef35eSSatish Balay       volatile unsigned long _argvec[13];                        \
51876edef35eSSatish Balay       volatile unsigned long _res;                               \
51886edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                  \
51896edef35eSSatish Balay       _argvec[1] = (unsigned long)arg1;                          \
51906edef35eSSatish Balay       _argvec[2] = (unsigned long)arg2;                          \
51916edef35eSSatish Balay       _argvec[3] = (unsigned long)arg3;                          \
51926edef35eSSatish Balay       _argvec[4] = (unsigned long)arg4;                          \
51936edef35eSSatish Balay       _argvec[5] = (unsigned long)arg5;                          \
51946edef35eSSatish Balay       _argvec[6] = (unsigned long)arg6;                          \
51956edef35eSSatish Balay       _argvec[7] = (unsigned long)arg7;                          \
51966edef35eSSatish Balay       _argvec[8] = (unsigned long)arg8;                          \
51976edef35eSSatish Balay       _argvec[9] = (unsigned long)arg9;                          \
51986edef35eSSatish Balay       _argvec[10] = (unsigned long)arg10;                        \
51996edef35eSSatish Balay       _argvec[11] = (unsigned long)arg11;                        \
52006edef35eSSatish Balay       _argvec[12] = (unsigned long)arg12;                        \
52016edef35eSSatish Balay       __asm__ volatile(                                          \
52026edef35eSSatish Balay          VALGRIND_CFI_PROLOGUE                                   \
52036edef35eSSatish Balay          "aghi 15,-216\n\t"                                      \
52046edef35eSSatish Balay          "lg 2, 8(1)\n\t"                                        \
52056edef35eSSatish Balay          "lg 3,16(1)\n\t"                                        \
52066edef35eSSatish Balay          "lg 4,24(1)\n\t"                                        \
52076edef35eSSatish Balay          "lg 5,32(1)\n\t"                                        \
52086edef35eSSatish Balay          "lg 6,40(1)\n\t"                                        \
52096edef35eSSatish Balay          "mvc 160(8,15), 48(1)\n\t"                              \
52106edef35eSSatish Balay          "mvc 168(8,15), 56(1)\n\t"                              \
52116edef35eSSatish Balay          "mvc 176(8,15), 64(1)\n\t"                              \
52126edef35eSSatish Balay          "mvc 184(8,15), 72(1)\n\t"                              \
52136edef35eSSatish Balay          "mvc 192(8,15), 80(1)\n\t"                              \
52146edef35eSSatish Balay          "mvc 200(8,15), 88(1)\n\t"                              \
52156edef35eSSatish Balay          "mvc 208(8,15), 96(1)\n\t"                              \
52166edef35eSSatish Balay          "lg 1, 0(1)\n\t"                                        \
52176edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_R1                                \
52186edef35eSSatish Balay          "aghi 15,216\n\t"                                       \
52196edef35eSSatish Balay          VALGRIND_CFI_EPILOGUE                                   \
52206edef35eSSatish Balay          "lgr %0, 2\n\t"                                         \
52216edef35eSSatish Balay          : /*out*/   "=d" (_res)                                 \
52226edef35eSSatish Balay          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
52236edef35eSSatish Balay          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
52246edef35eSSatish Balay       );                                                         \
52256edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                            \
52266edef35eSSatish Balay    } while (0)
52276edef35eSSatish Balay 
52286edef35eSSatish Balay 
52296edef35eSSatish Balay #endif /* PLAT_s390x_linux */
52306edef35eSSatish Balay 
52316edef35eSSatish Balay /* ------------------------- mips32-linux ----------------------- */
52326edef35eSSatish Balay 
52336edef35eSSatish Balay #if defined(PLAT_mips32_linux)
52346edef35eSSatish Balay 
52356edef35eSSatish Balay /* These regs are trashed by the hidden call. */
52366edef35eSSatish Balay #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6",       \
52376edef35eSSatish Balay "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
52386edef35eSSatish Balay "$25", "$31"
52396edef35eSSatish Balay 
52406edef35eSSatish Balay /* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned
52416edef35eSSatish Balay    long) == 4. */
52426edef35eSSatish Balay 
52436edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                   \
52446edef35eSSatish Balay    do {                                                           \
52456edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
52466edef35eSSatish Balay       volatile unsigned long _argvec[1];                          \
52476edef35eSSatish Balay       volatile unsigned long _res;                                \
52486edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
52496edef35eSSatish Balay       __asm__ volatile(                                           \
52506edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
52516edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
52526edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
52536edef35eSSatish Balay          "subu $29, $29, 16 \n\t"                                 \
52546edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
52556edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
52566edef35eSSatish Balay          "addu $29, $29, 16\n\t"                                  \
52576edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
52586edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
52596edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
52606edef35eSSatish Balay          "move %0, $2\n"                                          \
52616edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
52626edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
52636edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
52646edef35eSSatish Balay       );                                                          \
52656edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
52666edef35eSSatish Balay    } while (0)
52676edef35eSSatish Balay 
52686edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                             \
52696edef35eSSatish Balay    do {                                                           \
52706edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
52716edef35eSSatish Balay      volatile unsigned long _argvec[2];                           \
52726edef35eSSatish Balay       volatile unsigned long _res;                                \
52736edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
52746edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
52756edef35eSSatish Balay       __asm__ volatile(                                           \
52766edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
52776edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
52786edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
52796edef35eSSatish Balay          "subu $29, $29, 16 \n\t"                                 \
52806edef35eSSatish Balay          "lw $4, 4(%1) \n\t"   /* arg1*/                          \
52816edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
52826edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
52836edef35eSSatish Balay          "addu $29, $29, 16 \n\t"                                 \
52846edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
52856edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
52866edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
52876edef35eSSatish Balay          "move %0, $2\n"                                          \
52886edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
52896edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
52906edef35eSSatish Balay          : /*trash*/ "memory",  __CALLER_SAVED_REGS               \
52916edef35eSSatish Balay       );                                                          \
52926edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
52936edef35eSSatish Balay    } while (0)
52946edef35eSSatish Balay 
52956edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
52966edef35eSSatish Balay    do {                                                           \
52976edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
52986edef35eSSatish Balay       volatile unsigned long _argvec[3];                          \
52996edef35eSSatish Balay       volatile unsigned long _res;                                \
53006edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
53016edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
53026edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
53036edef35eSSatish Balay       __asm__ volatile(                                           \
53046edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
53056edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
53066edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
53076edef35eSSatish Balay          "subu $29, $29, 16 \n\t"                                 \
53086edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
53096edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
53106edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
53116edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
53126edef35eSSatish Balay          "addu $29, $29, 16 \n\t"                                 \
53136edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
53146edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
53156edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
53166edef35eSSatish Balay          "move %0, $2\n"                                          \
53176edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
53186edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
53196edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
53206edef35eSSatish Balay       );                                                          \
53216edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
53226edef35eSSatish Balay    } while (0)
53236edef35eSSatish Balay 
53246edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
53256edef35eSSatish Balay    do {                                                           \
53266edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
53276edef35eSSatish Balay       volatile unsigned long _argvec[4];                          \
53286edef35eSSatish Balay       volatile unsigned long _res;                                \
53296edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
53306edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
53316edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
53326edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
53336edef35eSSatish Balay       __asm__ volatile(                                           \
53346edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
53356edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
53366edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
53376edef35eSSatish Balay          "subu $29, $29, 16 \n\t"                                 \
53386edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
53396edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
53406edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
53416edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
53426edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
53436edef35eSSatish Balay          "addu $29, $29, 16 \n\t"                                 \
53446edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
53456edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
53466edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
53476edef35eSSatish Balay          "move %0, $2\n"                                          \
53486edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
53496edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
53506edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
53516edef35eSSatish Balay       );                                                          \
53526edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
53536edef35eSSatish Balay    } while (0)
53546edef35eSSatish Balay 
53556edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
53566edef35eSSatish Balay    do {                                                           \
53576edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
53586edef35eSSatish Balay       volatile unsigned long _argvec[5];                          \
53596edef35eSSatish Balay       volatile unsigned long _res;                                \
53606edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
53616edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
53626edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
53636edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
53646edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
53656edef35eSSatish Balay       __asm__ volatile(                                           \
53666edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
53676edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
53686edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
53696edef35eSSatish Balay          "subu $29, $29, 16 \n\t"                                 \
53706edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
53716edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
53726edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
53736edef35eSSatish Balay          "lw $7, 16(%1) \n\t"                                     \
53746edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
53756edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
53766edef35eSSatish Balay          "addu $29, $29, 16 \n\t"                                 \
53776edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
53786edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
53796edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
53806edef35eSSatish Balay          "move %0, $2\n"                                          \
53816edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
53826edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
53836edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
53846edef35eSSatish Balay       );                                                          \
53856edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
53866edef35eSSatish Balay    } while (0)
53876edef35eSSatish Balay 
53886edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
53896edef35eSSatish Balay    do {                                                           \
53906edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
53916edef35eSSatish Balay       volatile unsigned long _argvec[6];                          \
53926edef35eSSatish Balay       volatile unsigned long _res;                                \
53936edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
53946edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
53956edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
53966edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
53976edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
53986edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
53996edef35eSSatish Balay       __asm__ volatile(                                           \
54006edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
54016edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
54026edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
54036edef35eSSatish Balay          "lw $4, 20(%1) \n\t"                                     \
54046edef35eSSatish Balay          "subu $29, $29, 24\n\t"                                  \
54056edef35eSSatish Balay          "sw $4, 16($29) \n\t"                                    \
54066edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
54076edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
54086edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
54096edef35eSSatish Balay          "lw $7, 16(%1) \n\t"                                     \
54106edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
54116edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
54126edef35eSSatish Balay          "addu $29, $29, 24 \n\t"                                 \
54136edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
54146edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
54156edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
54166edef35eSSatish Balay          "move %0, $2\n"                                          \
54176edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
54186edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
54196edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
54206edef35eSSatish Balay       );                                                          \
54216edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
54226edef35eSSatish Balay    } while (0)
54236edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
54246edef35eSSatish Balay    do {                                                           \
54256edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
54266edef35eSSatish Balay       volatile unsigned long _argvec[7];                          \
54276edef35eSSatish Balay       volatile unsigned long _res;                                \
54286edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
54296edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
54306edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
54316edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
54326edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
54336edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
54346edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
54356edef35eSSatish Balay       __asm__ volatile(                                           \
54366edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
54376edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
54386edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
54396edef35eSSatish Balay          "lw $4, 20(%1) \n\t"                                     \
54406edef35eSSatish Balay          "subu $29, $29, 32\n\t"                                  \
54416edef35eSSatish Balay          "sw $4, 16($29) \n\t"                                    \
54426edef35eSSatish Balay          "lw $4, 24(%1) \n\t"                                     \
54436edef35eSSatish Balay          "nop\n\t"                                                \
54446edef35eSSatish Balay          "sw $4, 20($29) \n\t"                                    \
54456edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
54466edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
54476edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
54486edef35eSSatish Balay          "lw $7, 16(%1) \n\t"                                     \
54496edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
54506edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
54516edef35eSSatish Balay          "addu $29, $29, 32 \n\t"                                 \
54526edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
54536edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
54546edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
54556edef35eSSatish Balay          "move %0, $2\n"                                          \
54566edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
54576edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
54586edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
54596edef35eSSatish Balay       );                                                          \
54606edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
54616edef35eSSatish Balay    } while (0)
54626edef35eSSatish Balay 
54636edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
54646edef35eSSatish Balay                                  arg7)                            \
54656edef35eSSatish Balay    do {                                                           \
54666edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
54676edef35eSSatish Balay       volatile unsigned long _argvec[8];                          \
54686edef35eSSatish Balay       volatile unsigned long _res;                                \
54696edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
54706edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
54716edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
54726edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
54736edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
54746edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
54756edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
54766edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
54776edef35eSSatish Balay       __asm__ volatile(                                           \
54786edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
54796edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
54806edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
54816edef35eSSatish Balay          "lw $4, 20(%1) \n\t"                                     \
54826edef35eSSatish Balay          "subu $29, $29, 32\n\t"                                  \
54836edef35eSSatish Balay          "sw $4, 16($29) \n\t"                                    \
54846edef35eSSatish Balay          "lw $4, 24(%1) \n\t"                                     \
54856edef35eSSatish Balay          "sw $4, 20($29) \n\t"                                    \
54866edef35eSSatish Balay          "lw $4, 28(%1) \n\t"                                     \
54876edef35eSSatish Balay          "sw $4, 24($29) \n\t"                                    \
54886edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
54896edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
54906edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
54916edef35eSSatish Balay          "lw $7, 16(%1) \n\t"                                     \
54926edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
54936edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
54946edef35eSSatish Balay          "addu $29, $29, 32 \n\t"                                 \
54956edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
54966edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
54976edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
54986edef35eSSatish Balay          "move %0, $2\n"                                          \
54996edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
55006edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
55016edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
55026edef35eSSatish Balay       );                                                          \
55036edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
55046edef35eSSatish Balay    } while (0)
55056edef35eSSatish Balay 
55066edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
55076edef35eSSatish Balay                                  arg7,arg8)                       \
55086edef35eSSatish Balay    do {                                                           \
55096edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
55106edef35eSSatish Balay       volatile unsigned long _argvec[9];                          \
55116edef35eSSatish Balay       volatile unsigned long _res;                                \
55126edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
55136edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
55146edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
55156edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
55166edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
55176edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
55186edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
55196edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
55206edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
55216edef35eSSatish Balay       __asm__ volatile(                                           \
55226edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
55236edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
55246edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
55256edef35eSSatish Balay          "lw $4, 20(%1) \n\t"                                     \
55266edef35eSSatish Balay          "subu $29, $29, 40\n\t"                                  \
55276edef35eSSatish Balay          "sw $4, 16($29) \n\t"                                    \
55286edef35eSSatish Balay          "lw $4, 24(%1) \n\t"                                     \
55296edef35eSSatish Balay          "sw $4, 20($29) \n\t"                                    \
55306edef35eSSatish Balay          "lw $4, 28(%1) \n\t"                                     \
55316edef35eSSatish Balay          "sw $4, 24($29) \n\t"                                    \
55326edef35eSSatish Balay          "lw $4, 32(%1) \n\t"                                     \
55336edef35eSSatish Balay          "sw $4, 28($29) \n\t"                                    \
55346edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
55356edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
55366edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
55376edef35eSSatish Balay          "lw $7, 16(%1) \n\t"                                     \
55386edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
55396edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
55406edef35eSSatish Balay          "addu $29, $29, 40 \n\t"                                 \
55416edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
55426edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
55436edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
55446edef35eSSatish Balay          "move %0, $2\n"                                          \
55456edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
55466edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
55476edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
55486edef35eSSatish Balay       );                                                          \
55496edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
55506edef35eSSatish Balay    } while (0)
55516edef35eSSatish Balay 
55526edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
55536edef35eSSatish Balay                                  arg7,arg8,arg9)                  \
55546edef35eSSatish Balay    do {                                                           \
55556edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
55566edef35eSSatish Balay       volatile unsigned long _argvec[10];                         \
55576edef35eSSatish Balay       volatile unsigned long _res;                                \
55586edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
55596edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
55606edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
55616edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
55626edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
55636edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
55646edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
55656edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
55666edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
55676edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
55686edef35eSSatish Balay       __asm__ volatile(                                           \
55696edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
55706edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
55716edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
55726edef35eSSatish Balay          "lw $4, 20(%1) \n\t"                                     \
55736edef35eSSatish Balay          "subu $29, $29, 40\n\t"                                  \
55746edef35eSSatish Balay          "sw $4, 16($29) \n\t"                                    \
55756edef35eSSatish Balay          "lw $4, 24(%1) \n\t"                                     \
55766edef35eSSatish Balay          "sw $4, 20($29) \n\t"                                    \
55776edef35eSSatish Balay          "lw $4, 28(%1) \n\t"                                     \
55786edef35eSSatish Balay          "sw $4, 24($29) \n\t"                                    \
55796edef35eSSatish Balay          "lw $4, 32(%1) \n\t"                                     \
55806edef35eSSatish Balay          "sw $4, 28($29) \n\t"                                    \
55816edef35eSSatish Balay          "lw $4, 36(%1) \n\t"                                     \
55826edef35eSSatish Balay          "sw $4, 32($29) \n\t"                                    \
55836edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
55846edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
55856edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
55866edef35eSSatish Balay          "lw $7, 16(%1) \n\t"                                     \
55876edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
55886edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
55896edef35eSSatish Balay          "addu $29, $29, 40 \n\t"                                 \
55906edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
55916edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
55926edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
55936edef35eSSatish Balay          "move %0, $2\n"                                          \
55946edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
55956edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
55966edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
55976edef35eSSatish Balay       );                                                          \
55986edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
55996edef35eSSatish Balay    } while (0)
56006edef35eSSatish Balay 
56016edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
56026edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)           \
56036edef35eSSatish Balay    do {                                                           \
56046edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
56056edef35eSSatish Balay       volatile unsigned long _argvec[11];                         \
56066edef35eSSatish Balay       volatile unsigned long _res;                                \
56076edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
56086edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
56096edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
56106edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
56116edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
56126edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
56136edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
56146edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
56156edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
56166edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
56176edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
56186edef35eSSatish Balay       __asm__ volatile(                                           \
56196edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
56206edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
56216edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
56226edef35eSSatish Balay          "lw $4, 20(%1) \n\t"                                     \
56236edef35eSSatish Balay          "subu $29, $29, 48\n\t"                                  \
56246edef35eSSatish Balay          "sw $4, 16($29) \n\t"                                    \
56256edef35eSSatish Balay          "lw $4, 24(%1) \n\t"                                     \
56266edef35eSSatish Balay          "sw $4, 20($29) \n\t"                                    \
56276edef35eSSatish Balay          "lw $4, 28(%1) \n\t"                                     \
56286edef35eSSatish Balay          "sw $4, 24($29) \n\t"                                    \
56296edef35eSSatish Balay          "lw $4, 32(%1) \n\t"                                     \
56306edef35eSSatish Balay          "sw $4, 28($29) \n\t"                                    \
56316edef35eSSatish Balay          "lw $4, 36(%1) \n\t"                                     \
56326edef35eSSatish Balay          "sw $4, 32($29) \n\t"                                    \
56336edef35eSSatish Balay          "lw $4, 40(%1) \n\t"                                     \
56346edef35eSSatish Balay          "sw $4, 36($29) \n\t"                                    \
56356edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
56366edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
56376edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
56386edef35eSSatish Balay          "lw $7, 16(%1) \n\t"                                     \
56396edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
56406edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
56416edef35eSSatish Balay          "addu $29, $29, 48 \n\t"                                 \
56426edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
56436edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
56446edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
56456edef35eSSatish Balay          "move %0, $2\n"                                          \
56466edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
56476edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
56486edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
56496edef35eSSatish Balay       );                                                          \
56506edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
56516edef35eSSatish Balay    } while (0)
56526edef35eSSatish Balay 
56536edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
56546edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
56556edef35eSSatish Balay                                   arg11)                          \
56566edef35eSSatish Balay    do {                                                           \
56576edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
56586edef35eSSatish Balay       volatile unsigned long _argvec[12];                         \
56596edef35eSSatish Balay       volatile unsigned long _res;                                \
56606edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
56616edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
56626edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
56636edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
56646edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
56656edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
56666edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
56676edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
56686edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
56696edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
56706edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
56716edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
56726edef35eSSatish Balay       __asm__ volatile(                                           \
56736edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
56746edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
56756edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
56766edef35eSSatish Balay          "lw $4, 20(%1) \n\t"                                     \
56776edef35eSSatish Balay          "subu $29, $29, 48\n\t"                                  \
56786edef35eSSatish Balay          "sw $4, 16($29) \n\t"                                    \
56796edef35eSSatish Balay          "lw $4, 24(%1) \n\t"                                     \
56806edef35eSSatish Balay          "sw $4, 20($29) \n\t"                                    \
56816edef35eSSatish Balay          "lw $4, 28(%1) \n\t"                                     \
56826edef35eSSatish Balay          "sw $4, 24($29) \n\t"                                    \
56836edef35eSSatish Balay          "lw $4, 32(%1) \n\t"                                     \
56846edef35eSSatish Balay          "sw $4, 28($29) \n\t"                                    \
56856edef35eSSatish Balay          "lw $4, 36(%1) \n\t"                                     \
56866edef35eSSatish Balay          "sw $4, 32($29) \n\t"                                    \
56876edef35eSSatish Balay          "lw $4, 40(%1) \n\t"                                     \
56886edef35eSSatish Balay          "sw $4, 36($29) \n\t"                                    \
56896edef35eSSatish Balay          "lw $4, 44(%1) \n\t"                                     \
56906edef35eSSatish Balay          "sw $4, 40($29) \n\t"                                    \
56916edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
56926edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
56936edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
56946edef35eSSatish Balay          "lw $7, 16(%1) \n\t"                                     \
56956edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
56966edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
56976edef35eSSatish Balay          "addu $29, $29, 48 \n\t"                                 \
56986edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
56996edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
57006edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
57016edef35eSSatish Balay          "move %0, $2\n"                                          \
57026edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
57036edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
57046edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
57056edef35eSSatish Balay       );                                                          \
57066edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
57076edef35eSSatish Balay    } while (0)
57086edef35eSSatish Balay 
57096edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
57106edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
57116edef35eSSatish Balay                                   arg11,arg12)                    \
57126edef35eSSatish Balay    do {                                                           \
57136edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
57146edef35eSSatish Balay       volatile unsigned long _argvec[13];                         \
57156edef35eSSatish Balay       volatile unsigned long _res;                                \
57166edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
57176edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
57186edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
57196edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
57206edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
57216edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
57226edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
57236edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
57246edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
57256edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
57266edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
57276edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
57286edef35eSSatish Balay       _argvec[12] = (unsigned long)(arg12);                       \
57296edef35eSSatish Balay       __asm__ volatile(                                           \
57306edef35eSSatish Balay          "subu $29, $29, 8 \n\t"                                  \
57316edef35eSSatish Balay          "sw $28, 0($29) \n\t"                                    \
57326edef35eSSatish Balay          "sw $31, 4($29) \n\t"                                    \
57336edef35eSSatish Balay          "lw $4, 20(%1) \n\t"                                     \
57346edef35eSSatish Balay          "subu $29, $29, 56\n\t"                                  \
57356edef35eSSatish Balay          "sw $4, 16($29) \n\t"                                    \
57366edef35eSSatish Balay          "lw $4, 24(%1) \n\t"                                     \
57376edef35eSSatish Balay          "sw $4, 20($29) \n\t"                                    \
57386edef35eSSatish Balay          "lw $4, 28(%1) \n\t"                                     \
57396edef35eSSatish Balay          "sw $4, 24($29) \n\t"                                    \
57406edef35eSSatish Balay          "lw $4, 32(%1) \n\t"                                     \
57416edef35eSSatish Balay          "sw $4, 28($29) \n\t"                                    \
57426edef35eSSatish Balay          "lw $4, 36(%1) \n\t"                                     \
57436edef35eSSatish Balay          "sw $4, 32($29) \n\t"                                    \
57446edef35eSSatish Balay          "lw $4, 40(%1) \n\t"                                     \
57456edef35eSSatish Balay          "sw $4, 36($29) \n\t"                                    \
57466edef35eSSatish Balay          "lw $4, 44(%1) \n\t"                                     \
57476edef35eSSatish Balay          "sw $4, 40($29) \n\t"                                    \
57486edef35eSSatish Balay          "lw $4, 48(%1) \n\t"                                     \
57496edef35eSSatish Balay          "sw $4, 44($29) \n\t"                                    \
57506edef35eSSatish Balay          "lw $4, 4(%1) \n\t"                                      \
57516edef35eSSatish Balay          "lw $5, 8(%1) \n\t"                                      \
57526edef35eSSatish Balay          "lw $6, 12(%1) \n\t"                                     \
57536edef35eSSatish Balay          "lw $7, 16(%1) \n\t"                                     \
57546edef35eSSatish Balay          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
57556edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
57566edef35eSSatish Balay          "addu $29, $29, 56 \n\t"                                 \
57576edef35eSSatish Balay          "lw $28, 0($29) \n\t"                                    \
57586edef35eSSatish Balay          "lw $31, 4($29) \n\t"                                    \
57596edef35eSSatish Balay          "addu $29, $29, 8 \n\t"                                  \
57606edef35eSSatish Balay          "move %0, $2\n"                                          \
57616edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
57626edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
57636edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
57646edef35eSSatish Balay       );                                                          \
57656edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
57666edef35eSSatish Balay    } while (0)
57676edef35eSSatish Balay 
57686edef35eSSatish Balay #endif /* PLAT_mips32_linux */
57696edef35eSSatish Balay 
57706edef35eSSatish Balay /* ------------------------- nanomips-linux -------------------- */
57716edef35eSSatish Balay 
57726edef35eSSatish Balay #if defined(PLAT_nanomips_linux)
57736edef35eSSatish Balay 
57746edef35eSSatish Balay /* These regs are trashed by the hidden call. */
57756edef35eSSatish Balay #define __CALLER_SAVED_REGS "$t4", "$t5", "$a0", "$a1", "$a2",     \
57766edef35eSSatish Balay "$a3", "$a4", "$a5", "$a6", "$a7", "$t0", "$t1", "$t2", "$t3",     \
57776edef35eSSatish Balay "$t8","$t9", "$at"
57786edef35eSSatish Balay 
57796edef35eSSatish Balay /* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned
57806edef35eSSatish Balay    long) == 4. */
57816edef35eSSatish Balay 
57826edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                   \
57836edef35eSSatish Balay    do {                                                           \
57846edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
57856edef35eSSatish Balay       volatile unsigned long _argvec[1];                          \
57866edef35eSSatish Balay       volatile unsigned long _res;                                \
57876edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
57886edef35eSSatish Balay       __asm__ volatile(                                           \
57896edef35eSSatish Balay          "lw $t9, 0(%1)\n\t"                                      \
57906edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
57916edef35eSSatish Balay          "move %0, $a0\n"                                         \
57926edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
57936edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
57946edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
57956edef35eSSatish Balay       );                                                          \
57966edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
57976edef35eSSatish Balay    } while (0)
57986edef35eSSatish Balay 
57996edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                             \
58006edef35eSSatish Balay    do {                                                           \
58016edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
58026edef35eSSatish Balay       volatile unsigned long _argvec[2];                          \
58036edef35eSSatish Balay       volatile unsigned long _res;                                \
58046edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
58056edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
58066edef35eSSatish Balay       __asm__ volatile(                                           \
58076edef35eSSatish Balay          "lw $t9, 0(%1)\n\t"                                      \
58086edef35eSSatish Balay          "lw $a0, 4(%1)\n\t"                                      \
58096edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
58106edef35eSSatish Balay          "move %0, $a0\n"                                         \
58116edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
58126edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
58136edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
58146edef35eSSatish Balay       );                                                          \
58156edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
58166edef35eSSatish Balay    } while (0)
58176edef35eSSatish Balay 
58186edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
58196edef35eSSatish Balay    do {                                                           \
58206edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
58216edef35eSSatish Balay       volatile unsigned long _argvec[3];                          \
58226edef35eSSatish Balay       volatile unsigned long _res;                                \
58236edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
58246edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
58256edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
58266edef35eSSatish Balay       __asm__ volatile(                                           \
58276edef35eSSatish Balay          "lw $t9, 0(%1)\n\t"                                      \
58286edef35eSSatish Balay          "lw $a0, 4(%1)\n\t"                                      \
58296edef35eSSatish Balay          "lw $a1, 8(%1)\n\t"                                      \
58306edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
58316edef35eSSatish Balay          "move %0, $a0\n"                                         \
58326edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
58336edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
58346edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
58356edef35eSSatish Balay       );                                                          \
58366edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
58376edef35eSSatish Balay    } while (0)
58386edef35eSSatish Balay 
58396edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
58406edef35eSSatish Balay    do {                                                           \
58416edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
58426edef35eSSatish Balay       volatile unsigned long _argvec[4];                          \
58436edef35eSSatish Balay       volatile unsigned long _res;                                \
58446edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
58456edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
58466edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
58476edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
58486edef35eSSatish Balay       __asm__ volatile(                                           \
58496edef35eSSatish Balay          "lw $t9, 0(%1)\n\t"                                      \
58506edef35eSSatish Balay          "lw $a0, 4(%1)\n\t"                                      \
58516edef35eSSatish Balay          "lw $a1, 8(%1)\n\t"                                      \
58526edef35eSSatish Balay          "lw $a2,12(%1)\n\t"                                      \
58536edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
58546edef35eSSatish Balay          "move %0, $a0\n"                                         \
58556edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
58566edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
58576edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
58586edef35eSSatish Balay       );                                                          \
58596edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
58606edef35eSSatish Balay    } while (0)
58616edef35eSSatish Balay 
58626edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
58636edef35eSSatish Balay    do {                                                           \
58646edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
58656edef35eSSatish Balay       volatile unsigned long _argvec[5];                          \
58666edef35eSSatish Balay       volatile unsigned long _res;                                \
58676edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
58686edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
58696edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
58706edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
58716edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
58726edef35eSSatish Balay       __asm__ volatile(                                           \
58736edef35eSSatish Balay          "lw $t9, 0(%1)\n\t"                                      \
58746edef35eSSatish Balay          "lw $a0, 4(%1)\n\t"                                      \
58756edef35eSSatish Balay          "lw $a1, 8(%1)\n\t"                                      \
58766edef35eSSatish Balay          "lw $a2,12(%1)\n\t"                                      \
58776edef35eSSatish Balay          "lw $a3,16(%1)\n\t"                                      \
58786edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
58796edef35eSSatish Balay          "move %0, $a0\n"                                         \
58806edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
58816edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
58826edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
58836edef35eSSatish Balay       );                                                          \
58846edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
58856edef35eSSatish Balay    } while (0)
58866edef35eSSatish Balay 
58876edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
58886edef35eSSatish Balay    do {                                                           \
58896edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
58906edef35eSSatish Balay       volatile unsigned long _argvec[6];                          \
58916edef35eSSatish Balay       volatile unsigned long _res;                                \
58926edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
58936edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
58946edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
58956edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
58966edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
58976edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
58986edef35eSSatish Balay       __asm__ volatile(                                           \
58996edef35eSSatish Balay          "lw $t9, 0(%1)\n\t"                                      \
59006edef35eSSatish Balay          "lw $a0, 4(%1)\n\t"                                      \
59016edef35eSSatish Balay          "lw $a1, 8(%1)\n\t"                                      \
59026edef35eSSatish Balay          "lw $a2,12(%1)\n\t"                                      \
59036edef35eSSatish Balay          "lw $a3,16(%1)\n\t"                                      \
59046edef35eSSatish Balay          "lw $a4,20(%1)\n\t"                                      \
59056edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
59066edef35eSSatish Balay          "move %0, $a0\n"                                         \
59076edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
59086edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
59096edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
59106edef35eSSatish Balay       );                                                          \
59116edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
59126edef35eSSatish Balay    } while (0)
59136edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
59146edef35eSSatish Balay    do {                                                           \
59156edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
59166edef35eSSatish Balay       volatile unsigned long _argvec[7];                          \
59176edef35eSSatish Balay       volatile unsigned long _res;                                \
59186edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
59196edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
59206edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
59216edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
59226edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
59236edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
59246edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
59256edef35eSSatish Balay       __asm__ volatile(                                           \
59266edef35eSSatish Balay          "lw $t9, 0(%1)\n\t"                                      \
59276edef35eSSatish Balay          "lw $a0, 4(%1)\n\t"                                      \
59286edef35eSSatish Balay          "lw $a1, 8(%1)\n\t"                                      \
59296edef35eSSatish Balay          "lw $a2,12(%1)\n\t"                                      \
59306edef35eSSatish Balay          "lw $a3,16(%1)\n\t"                                      \
59316edef35eSSatish Balay          "lw $a4,20(%1)\n\t"                                      \
59326edef35eSSatish Balay          "lw $a5,24(%1)\n\t"                                      \
59336edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
59346edef35eSSatish Balay          "move %0, $a0\n"                                         \
59356edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
59366edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
59376edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
59386edef35eSSatish Balay       );                                                          \
59396edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
59406edef35eSSatish Balay    } while (0)
59416edef35eSSatish Balay 
59426edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
59436edef35eSSatish Balay                                  arg7)                            \
59446edef35eSSatish Balay    do {                                                           \
59456edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
59466edef35eSSatish Balay       volatile unsigned long _argvec[8];                          \
59476edef35eSSatish Balay       volatile unsigned long _res;                                \
59486edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
59496edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
59506edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
59516edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
59526edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
59536edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
59546edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
59556edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
59566edef35eSSatish Balay       __asm__ volatile(                                           \
59576edef35eSSatish Balay          "lw $t9, 0(%1)\n\t"                                      \
59586edef35eSSatish Balay          "lw $a0, 4(%1)\n\t"                                      \
59596edef35eSSatish Balay          "lw $a1, 8(%1)\n\t"                                      \
59606edef35eSSatish Balay          "lw $a2,12(%1)\n\t"                                      \
59616edef35eSSatish Balay          "lw $a3,16(%1)\n\t"                                      \
59626edef35eSSatish Balay          "lw $a4,20(%1)\n\t"                                      \
59636edef35eSSatish Balay          "lw $a5,24(%1)\n\t"                                      \
59646edef35eSSatish Balay          "lw $a6,28(%1)\n\t"                                      \
59656edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
59666edef35eSSatish Balay          "move %0, $a0\n"                                         \
59676edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
59686edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
59696edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
59706edef35eSSatish Balay       );                                                          \
59716edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
59726edef35eSSatish Balay    } while (0)
59736edef35eSSatish Balay 
59746edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
59756edef35eSSatish Balay                                  arg7,arg8)                       \
59766edef35eSSatish Balay    do {                                                           \
59776edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
59786edef35eSSatish Balay       volatile unsigned long _argvec[9];                          \
59796edef35eSSatish Balay       volatile unsigned long _res;                                \
59806edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
59816edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
59826edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
59836edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
59846edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
59856edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
59866edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
59876edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
59886edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
59896edef35eSSatish Balay       __asm__ volatile(                                           \
59906edef35eSSatish Balay          "lw $t9, 0(%1)\n\t"                                      \
59916edef35eSSatish Balay          "lw $a0, 4(%1)\n\t"                                      \
59926edef35eSSatish Balay          "lw $a1, 8(%1)\n\t"                                      \
59936edef35eSSatish Balay          "lw $a2,12(%1)\n\t"                                      \
59946edef35eSSatish Balay          "lw $a3,16(%1)\n\t"                                      \
59956edef35eSSatish Balay          "lw $a4,20(%1)\n\t"                                      \
59966edef35eSSatish Balay          "lw $a5,24(%1)\n\t"                                      \
59976edef35eSSatish Balay          "lw $a6,28(%1)\n\t"                                      \
59986edef35eSSatish Balay          "lw $a7,32(%1)\n\t"                                      \
59996edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
60006edef35eSSatish Balay          "move %0, $a0\n"                                         \
60016edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
60026edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
60036edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
60046edef35eSSatish Balay       );                                                          \
60056edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
60066edef35eSSatish Balay    } while (0)
60076edef35eSSatish Balay 
60086edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
60096edef35eSSatish Balay                                  arg7,arg8,arg9)                  \
60106edef35eSSatish Balay    do {                                                           \
60116edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
60126edef35eSSatish Balay       volatile unsigned long _argvec[10];                         \
60136edef35eSSatish Balay       volatile unsigned long _res;                                \
60146edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
60156edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
60166edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
60176edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
60186edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
60196edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
60206edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
60216edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
60226edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
60236edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
60246edef35eSSatish Balay       __asm__ volatile(                                           \
60256edef35eSSatish Balay          "addiu $sp, $sp, -16  \n\t"                              \
60266edef35eSSatish Balay          "lw $t9,36(%1)        \n\t"                              \
60276edef35eSSatish Balay          "sw $t9, 0($sp)       \n\t"                              \
60286edef35eSSatish Balay          "lw $t9, 0(%1)        \n\t"                              \
60296edef35eSSatish Balay          "lw $a0, 4(%1)        \n\t"                              \
60306edef35eSSatish Balay          "lw $a1, 8(%1)        \n\t"                              \
60316edef35eSSatish Balay          "lw $a2,12(%1)        \n\t"                              \
60326edef35eSSatish Balay          "lw $a3,16(%1)        \n\t"                              \
60336edef35eSSatish Balay          "lw $a4,20(%1)        \n\t"                              \
60346edef35eSSatish Balay          "lw $a5,24(%1)        \n\t"                              \
60356edef35eSSatish Balay          "lw $a6,28(%1)        \n\t"                              \
60366edef35eSSatish Balay          "lw $a7,32(%1)        \n\t"                              \
60376edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
60386edef35eSSatish Balay          "move %0, $a0         \n\t"                              \
60396edef35eSSatish Balay          "addiu $sp, $sp, 16   \n\t"                              \
60406edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
60416edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
60426edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
60436edef35eSSatish Balay       );                                                          \
60446edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
60456edef35eSSatish Balay    } while (0)
60466edef35eSSatish Balay 
60476edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
60486edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)           \
60496edef35eSSatish Balay    do {                                                           \
60506edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
60516edef35eSSatish Balay       volatile unsigned long _argvec[11];                         \
60526edef35eSSatish Balay       volatile unsigned long _res;                                \
60536edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
60546edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
60556edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
60566edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
60576edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
60586edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
60596edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
60606edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
60616edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
60626edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
60636edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
60646edef35eSSatish Balay       __asm__ volatile(                                           \
60656edef35eSSatish Balay          "addiu $sp, $sp, -16  \n\t"                              \
60666edef35eSSatish Balay          "lw $t9,36(%1)        \n\t"                              \
60676edef35eSSatish Balay          "sw $t9, 0($sp)       \n\t"                              \
60686edef35eSSatish Balay          "lw $t9,40(%1)        \n\t"                              \
60696edef35eSSatish Balay          "sw $t9, 4($sp)       \n\t"                              \
60706edef35eSSatish Balay          "lw $t9, 0(%1)        \n\t"                              \
60716edef35eSSatish Balay          "lw $a0, 4(%1)        \n\t"                              \
60726edef35eSSatish Balay          "lw $a1, 8(%1)        \n\t"                              \
60736edef35eSSatish Balay          "lw $a2,12(%1)        \n\t"                              \
60746edef35eSSatish Balay          "lw $a3,16(%1)        \n\t"                              \
60756edef35eSSatish Balay          "lw $a4,20(%1)        \n\t"                              \
60766edef35eSSatish Balay          "lw $a5,24(%1)        \n\t"                              \
60776edef35eSSatish Balay          "lw $a6,28(%1)        \n\t"                              \
60786edef35eSSatish Balay          "lw $a7,32(%1)        \n\t"                              \
60796edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
60806edef35eSSatish Balay          "move %0, $a0         \n\t"                              \
60816edef35eSSatish Balay          "addiu $sp, $sp, 16   \n\t"                              \
60826edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
60836edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
60846edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
60856edef35eSSatish Balay       );                                                          \
60866edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
60876edef35eSSatish Balay    } while (0)
60886edef35eSSatish Balay 
60896edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
60906edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
60916edef35eSSatish Balay                                   arg11)                          \
60926edef35eSSatish Balay    do {                                                           \
60936edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
60946edef35eSSatish Balay       volatile unsigned long _argvec[12];                         \
60956edef35eSSatish Balay       volatile unsigned long _res;                                \
60966edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
60976edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
60986edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
60996edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
61006edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
61016edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
61026edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
61036edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
61046edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
61056edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
61066edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
61076edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
61086edef35eSSatish Balay       __asm__ volatile(                                           \
61096edef35eSSatish Balay          "addiu $sp, $sp, -16  \n\t"                              \
61106edef35eSSatish Balay          "lw $t9,36(%1)        \n\t"                              \
61116edef35eSSatish Balay          "sw $t9, 0($sp)       \n\t"                              \
61126edef35eSSatish Balay          "lw $t9,40(%1)        \n\t"                              \
61136edef35eSSatish Balay          "sw $t9, 4($sp)       \n\t"                              \
61146edef35eSSatish Balay          "lw $t9,44(%1)        \n\t"                              \
61156edef35eSSatish Balay          "sw $t9, 8($sp)       \n\t"                              \
61166edef35eSSatish Balay          "lw $t9, 0(%1)        \n\t"                              \
61176edef35eSSatish Balay          "lw $a0, 4(%1)        \n\t"                              \
61186edef35eSSatish Balay          "lw $a1, 8(%1)        \n\t"                              \
61196edef35eSSatish Balay          "lw $a2,12(%1)        \n\t"                              \
61206edef35eSSatish Balay          "lw $a3,16(%1)        \n\t"                              \
61216edef35eSSatish Balay          "lw $a4,20(%1)        \n\t"                              \
61226edef35eSSatish Balay          "lw $a5,24(%1)        \n\t"                              \
61236edef35eSSatish Balay          "lw $a6,28(%1)        \n\t"                              \
61246edef35eSSatish Balay          "lw $a7,32(%1)        \n\t"                              \
61256edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
61266edef35eSSatish Balay          "move %0, $a0         \n\t"                              \
61276edef35eSSatish Balay          "addiu $sp, $sp, 16   \n\t"                              \
61286edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
61296edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
61306edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
61316edef35eSSatish Balay       );                                                          \
61326edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
61336edef35eSSatish Balay    } while (0)
61346edef35eSSatish Balay 
61356edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
61366edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
61376edef35eSSatish Balay                                   arg11,arg12)                    \
61386edef35eSSatish Balay    do {                                                           \
61396edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
61406edef35eSSatish Balay       volatile unsigned long _argvec[13];                         \
61416edef35eSSatish Balay       volatile unsigned long _res;                                \
61426edef35eSSatish Balay       _argvec[0] = (unsigned long)_orig.nraddr;                   \
61436edef35eSSatish Balay       _argvec[1] = (unsigned long)(arg1);                         \
61446edef35eSSatish Balay       _argvec[2] = (unsigned long)(arg2);                         \
61456edef35eSSatish Balay       _argvec[3] = (unsigned long)(arg3);                         \
61466edef35eSSatish Balay       _argvec[4] = (unsigned long)(arg4);                         \
61476edef35eSSatish Balay       _argvec[5] = (unsigned long)(arg5);                         \
61486edef35eSSatish Balay       _argvec[6] = (unsigned long)(arg6);                         \
61496edef35eSSatish Balay       _argvec[7] = (unsigned long)(arg7);                         \
61506edef35eSSatish Balay       _argvec[8] = (unsigned long)(arg8);                         \
61516edef35eSSatish Balay       _argvec[9] = (unsigned long)(arg9);                         \
61526edef35eSSatish Balay       _argvec[10] = (unsigned long)(arg10);                       \
61536edef35eSSatish Balay       _argvec[11] = (unsigned long)(arg11);                       \
61546edef35eSSatish Balay       _argvec[12] = (unsigned long)(arg12);                       \
61556edef35eSSatish Balay       __asm__ volatile(                                           \
61566edef35eSSatish Balay          "addiu $sp, $sp, -16  \n\t"                              \
61576edef35eSSatish Balay          "lw $t9,36(%1)        \n\t"                              \
61586edef35eSSatish Balay          "sw $t9, 0($sp)       \n\t"                              \
61596edef35eSSatish Balay          "lw $t9,40(%1)        \n\t"                              \
61606edef35eSSatish Balay          "sw $t9, 4($sp)       \n\t"                              \
61616edef35eSSatish Balay          "lw $t9,44(%1)        \n\t"                              \
61626edef35eSSatish Balay          "sw $t9, 8($sp)       \n\t"                              \
61636edef35eSSatish Balay          "lw $t9,48(%1)        \n\t"                              \
61646edef35eSSatish Balay          "sw $t9,12($sp)       \n\t"                              \
61656edef35eSSatish Balay          "lw $t9, 0(%1)        \n\t"                              \
61666edef35eSSatish Balay          "lw $a0, 4(%1)        \n\t"                              \
61676edef35eSSatish Balay          "lw $a1, 8(%1)        \n\t"                              \
61686edef35eSSatish Balay          "lw $a2,12(%1)        \n\t"                              \
61696edef35eSSatish Balay          "lw $a3,16(%1)        \n\t"                              \
61706edef35eSSatish Balay          "lw $a4,20(%1)        \n\t"                              \
61716edef35eSSatish Balay          "lw $a5,24(%1)        \n\t"                              \
61726edef35eSSatish Balay          "lw $a6,28(%1)        \n\t"                              \
61736edef35eSSatish Balay          "lw $a7,32(%1)        \n\t"                              \
61746edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
61756edef35eSSatish Balay          "move %0, $a0         \n\t"                              \
61766edef35eSSatish Balay          "addiu $sp, $sp, 16   \n\t"                              \
61776edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
61786edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
61796edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
61806edef35eSSatish Balay       );                                                          \
61816edef35eSSatish Balay       lval = (__typeof__(lval)) _res;                             \
61826edef35eSSatish Balay    } while (0)
61836edef35eSSatish Balay 
61846edef35eSSatish Balay #endif /* PLAT_nanomips_linux */
61856edef35eSSatish Balay 
61866edef35eSSatish Balay /* ------------------------- mips64-linux ------------------------- */
61876edef35eSSatish Balay 
61886edef35eSSatish Balay #if defined(PLAT_mips64_linux)
61896edef35eSSatish Balay 
61906edef35eSSatish Balay /* These regs are trashed by the hidden call. */
61916edef35eSSatish Balay #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6",       \
61926edef35eSSatish Balay "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
61936edef35eSSatish Balay "$25", "$31"
61946edef35eSSatish Balay 
61956edef35eSSatish Balay /* These CALL_FN_ macros assume that on mips64-linux,
61966edef35eSSatish Balay    sizeof(long long) == 8. */
61976edef35eSSatish Balay 
61986edef35eSSatish Balay #define MIPS64_LONG2REG_CAST(x) ((long long)(long)x)
61996edef35eSSatish Balay 
62006edef35eSSatish Balay #define CALL_FN_W_v(lval, orig)                                   \
62016edef35eSSatish Balay    do {                                                           \
62026edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
62036edef35eSSatish Balay       volatile unsigned long long _argvec[1];                     \
62046edef35eSSatish Balay       volatile unsigned long long _res;                           \
62056edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
62066edef35eSSatish Balay       __asm__ volatile(                                           \
62076edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
62086edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
62096edef35eSSatish Balay          "move %0, $2\n"                                          \
62106edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
62116edef35eSSatish Balay          : /*in*/    "0" (&_argvec[0])                            \
62126edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
62136edef35eSSatish Balay       );                                                          \
62146edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
62156edef35eSSatish Balay    } while (0)
62166edef35eSSatish Balay 
62176edef35eSSatish Balay #define CALL_FN_W_W(lval, orig, arg1)                             \
62186edef35eSSatish Balay    do {                                                           \
62196edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
62206edef35eSSatish Balay       volatile unsigned long long _argvec[2];                     \
62216edef35eSSatish Balay       volatile unsigned long long  _res;                          \
62226edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
62236edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
62246edef35eSSatish Balay       __asm__ volatile(                                           \
62256edef35eSSatish Balay          "ld $4, 8(%1)\n\t"   /* arg1*/                           \
62266edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
62276edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
62286edef35eSSatish Balay          "move %0, $2\n"                                          \
62296edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
62306edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
62316edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
62326edef35eSSatish Balay       );                                                          \
62336edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
62346edef35eSSatish Balay    } while (0)
62356edef35eSSatish Balay 
62366edef35eSSatish Balay #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
62376edef35eSSatish Balay    do {                                                           \
62386edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
62396edef35eSSatish Balay       volatile unsigned long long _argvec[3];                     \
62406edef35eSSatish Balay       volatile unsigned long long _res;                           \
62416edef35eSSatish Balay       _argvec[0] = _orig.nraddr;                                  \
62426edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
62436edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
62446edef35eSSatish Balay       __asm__ volatile(                                           \
62456edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
62466edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
62476edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
62486edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
62496edef35eSSatish Balay          "move %0, $2\n"                                          \
62506edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
62516edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
62526edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
62536edef35eSSatish Balay       );                                                          \
62546edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
62556edef35eSSatish Balay    } while (0)
62566edef35eSSatish Balay 
62576edef35eSSatish Balay 
62586edef35eSSatish Balay #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
62596edef35eSSatish Balay    do {                                                           \
62606edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
62616edef35eSSatish Balay       volatile unsigned long long _argvec[4];                     \
62626edef35eSSatish Balay       volatile unsigned long long _res;                           \
62636edef35eSSatish Balay       _argvec[0] = _orig.nraddr;                                  \
62646edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
62656edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
62666edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
62676edef35eSSatish Balay       __asm__ volatile(                                           \
62686edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
62696edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
62706edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
62716edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
62726edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
62736edef35eSSatish Balay          "move %0, $2\n"                                          \
62746edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
62756edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
62766edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
62776edef35eSSatish Balay       );                                                          \
62786edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
62796edef35eSSatish Balay    } while (0)
62806edef35eSSatish Balay 
62816edef35eSSatish Balay #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
62826edef35eSSatish Balay    do {                                                           \
62836edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
62846edef35eSSatish Balay       volatile unsigned long long _argvec[5];                     \
62856edef35eSSatish Balay       volatile unsigned long long _res;                           \
62866edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
62876edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
62886edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
62896edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
62906edef35eSSatish Balay       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
62916edef35eSSatish Balay       __asm__ volatile(                                           \
62926edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
62936edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
62946edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
62956edef35eSSatish Balay          "ld $7, 32(%1)\n\t"                                      \
62966edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
62976edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
62986edef35eSSatish Balay          "move %0, $2\n"                                          \
62996edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
63006edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
63016edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
63026edef35eSSatish Balay       );                                                          \
63036edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
63046edef35eSSatish Balay    } while (0)
63056edef35eSSatish Balay 
63066edef35eSSatish Balay #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
63076edef35eSSatish Balay    do {                                                           \
63086edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
63096edef35eSSatish Balay       volatile unsigned long long _argvec[6];                     \
63106edef35eSSatish Balay       volatile unsigned long long _res;                           \
63116edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
63126edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
63136edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
63146edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
63156edef35eSSatish Balay       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
63166edef35eSSatish Balay       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
63176edef35eSSatish Balay       __asm__ volatile(                                           \
63186edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
63196edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
63206edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
63216edef35eSSatish Balay          "ld $7, 32(%1)\n\t"                                      \
63226edef35eSSatish Balay          "ld $8, 40(%1)\n\t"                                      \
63236edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
63246edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
63256edef35eSSatish Balay          "move %0, $2\n"                                          \
63266edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
63276edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
63286edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
63296edef35eSSatish Balay       );                                                          \
63306edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
63316edef35eSSatish Balay    } while (0)
63326edef35eSSatish Balay 
63336edef35eSSatish Balay #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
63346edef35eSSatish Balay    do {                                                           \
63356edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
63366edef35eSSatish Balay       volatile unsigned long long _argvec[7];                     \
63376edef35eSSatish Balay       volatile unsigned long long _res;                           \
63386edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
63396edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
63406edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
63416edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
63426edef35eSSatish Balay       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
63436edef35eSSatish Balay       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
63446edef35eSSatish Balay       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
63456edef35eSSatish Balay       __asm__ volatile(                                           \
63466edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
63476edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
63486edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
63496edef35eSSatish Balay          "ld $7, 32(%1)\n\t"                                      \
63506edef35eSSatish Balay          "ld $8, 40(%1)\n\t"                                      \
63516edef35eSSatish Balay          "ld $9, 48(%1)\n\t"                                      \
63526edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
63536edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
63546edef35eSSatish Balay          "move %0, $2\n"                                          \
63556edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
63566edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
63576edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
63586edef35eSSatish Balay       );                                                          \
63596edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
63606edef35eSSatish Balay    } while (0)
63616edef35eSSatish Balay 
63626edef35eSSatish Balay #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
63636edef35eSSatish Balay                                  arg7)                            \
63646edef35eSSatish Balay    do {                                                           \
63656edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
63666edef35eSSatish Balay       volatile unsigned long long _argvec[8];                     \
63676edef35eSSatish Balay       volatile unsigned long long _res;                           \
63686edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
63696edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
63706edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
63716edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
63726edef35eSSatish Balay       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
63736edef35eSSatish Balay       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
63746edef35eSSatish Balay       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
63756edef35eSSatish Balay       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
63766edef35eSSatish Balay       __asm__ volatile(                                           \
63776edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
63786edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
63796edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
63806edef35eSSatish Balay          "ld $7, 32(%1)\n\t"                                      \
63816edef35eSSatish Balay          "ld $8, 40(%1)\n\t"                                      \
63826edef35eSSatish Balay          "ld $9, 48(%1)\n\t"                                      \
63836edef35eSSatish Balay          "ld $10, 56(%1)\n\t"                                     \
63846edef35eSSatish Balay          "ld $25, 0(%1) \n\t"  /* target->t9 */                   \
63856edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
63866edef35eSSatish Balay          "move %0, $2\n"                                          \
63876edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
63886edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
63896edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
63906edef35eSSatish Balay       );                                                          \
63916edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
63926edef35eSSatish Balay    } while (0)
63936edef35eSSatish Balay 
63946edef35eSSatish Balay #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
63956edef35eSSatish Balay                                  arg7,arg8)                       \
63966edef35eSSatish Balay    do {                                                           \
63976edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
63986edef35eSSatish Balay       volatile unsigned long long _argvec[9];                     \
63996edef35eSSatish Balay       volatile unsigned long long _res;                           \
64006edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
64016edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
64026edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
64036edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
64046edef35eSSatish Balay       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
64056edef35eSSatish Balay       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
64066edef35eSSatish Balay       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
64076edef35eSSatish Balay       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
64086edef35eSSatish Balay       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
64096edef35eSSatish Balay       __asm__ volatile(                                           \
64106edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
64116edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
64126edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
64136edef35eSSatish Balay          "ld $7, 32(%1)\n\t"                                      \
64146edef35eSSatish Balay          "ld $8, 40(%1)\n\t"                                      \
64156edef35eSSatish Balay          "ld $9, 48(%1)\n\t"                                      \
64166edef35eSSatish Balay          "ld $10, 56(%1)\n\t"                                     \
64176edef35eSSatish Balay          "ld $11, 64(%1)\n\t"                                     \
64186edef35eSSatish Balay          "ld $25, 0(%1) \n\t"  /* target->t9 */                   \
64196edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
64206edef35eSSatish Balay          "move %0, $2\n"                                          \
64216edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
64226edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
64236edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
64246edef35eSSatish Balay       );                                                          \
64256edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
64266edef35eSSatish Balay    } while (0)
64276edef35eSSatish Balay 
64286edef35eSSatish Balay #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
64296edef35eSSatish Balay                                  arg7,arg8,arg9)                  \
64306edef35eSSatish Balay    do {                                                           \
64316edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
64326edef35eSSatish Balay       volatile unsigned long long _argvec[10];                    \
64336edef35eSSatish Balay       volatile unsigned long long _res;                           \
64346edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
64356edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
64366edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
64376edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
64386edef35eSSatish Balay       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
64396edef35eSSatish Balay       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
64406edef35eSSatish Balay       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
64416edef35eSSatish Balay       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
64426edef35eSSatish Balay       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
64436edef35eSSatish Balay       _argvec[9] = MIPS64_LONG2REG_CAST(arg9);                    \
64446edef35eSSatish Balay       __asm__ volatile(                                           \
64456edef35eSSatish Balay          "dsubu $29, $29, 8\n\t"                                  \
64466edef35eSSatish Balay          "ld $4, 72(%1)\n\t"                                      \
64476edef35eSSatish Balay          "sd $4, 0($29)\n\t"                                      \
64486edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
64496edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
64506edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
64516edef35eSSatish Balay          "ld $7, 32(%1)\n\t"                                      \
64526edef35eSSatish Balay          "ld $8, 40(%1)\n\t"                                      \
64536edef35eSSatish Balay          "ld $9, 48(%1)\n\t"                                      \
64546edef35eSSatish Balay          "ld $10, 56(%1)\n\t"                                     \
64556edef35eSSatish Balay          "ld $11, 64(%1)\n\t"                                     \
64566edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
64576edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
64586edef35eSSatish Balay          "daddu $29, $29, 8\n\t"                                  \
64596edef35eSSatish Balay          "move %0, $2\n"                                          \
64606edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
64616edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
64626edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
64636edef35eSSatish Balay       );                                                          \
64646edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
64656edef35eSSatish Balay    } while (0)
64666edef35eSSatish Balay 
64676edef35eSSatish Balay #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
64686edef35eSSatish Balay                                   arg7,arg8,arg9,arg10)           \
64696edef35eSSatish Balay    do {                                                           \
64706edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
64716edef35eSSatish Balay       volatile unsigned long long _argvec[11];                    \
64726edef35eSSatish Balay       volatile unsigned long long _res;                           \
64736edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
64746edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
64756edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
64766edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
64776edef35eSSatish Balay       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
64786edef35eSSatish Balay       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
64796edef35eSSatish Balay       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
64806edef35eSSatish Balay       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
64816edef35eSSatish Balay       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
64826edef35eSSatish Balay       _argvec[9] = MIPS64_LONG2REG_CAST(arg9);                    \
64836edef35eSSatish Balay       _argvec[10] = MIPS64_LONG2REG_CAST(arg10);                  \
64846edef35eSSatish Balay       __asm__ volatile(                                           \
64856edef35eSSatish Balay          "dsubu $29, $29, 16\n\t"                                 \
64866edef35eSSatish Balay          "ld $4, 72(%1)\n\t"                                      \
64876edef35eSSatish Balay          "sd $4, 0($29)\n\t"                                      \
64886edef35eSSatish Balay          "ld $4, 80(%1)\n\t"                                      \
64896edef35eSSatish Balay          "sd $4, 8($29)\n\t"                                      \
64906edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
64916edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
64926edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
64936edef35eSSatish Balay          "ld $7, 32(%1)\n\t"                                      \
64946edef35eSSatish Balay          "ld $8, 40(%1)\n\t"                                      \
64956edef35eSSatish Balay          "ld $9, 48(%1)\n\t"                                      \
64966edef35eSSatish Balay          "ld $10, 56(%1)\n\t"                                     \
64976edef35eSSatish Balay          "ld $11, 64(%1)\n\t"                                     \
64986edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
64996edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
65006edef35eSSatish Balay          "daddu $29, $29, 16\n\t"                                 \
65016edef35eSSatish Balay          "move %0, $2\n"                                          \
65026edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
65036edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
65046edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
65056edef35eSSatish Balay       );                                                          \
65066edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
65076edef35eSSatish Balay    } while (0)
65086edef35eSSatish Balay 
65096edef35eSSatish Balay #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
65106edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
65116edef35eSSatish Balay                                   arg11)                          \
65126edef35eSSatish Balay    do {                                                           \
65136edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
65146edef35eSSatish Balay       volatile unsigned long long _argvec[12];                    \
65156edef35eSSatish Balay       volatile unsigned long long _res;                           \
65166edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
65176edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
65186edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
65196edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
65206edef35eSSatish Balay       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
65216edef35eSSatish Balay       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
65226edef35eSSatish Balay       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
65236edef35eSSatish Balay       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
65246edef35eSSatish Balay       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
65256edef35eSSatish Balay       _argvec[9] = MIPS64_LONG2REG_CAST(arg9);                    \
65266edef35eSSatish Balay       _argvec[10] = MIPS64_LONG2REG_CAST(arg10);                  \
65276edef35eSSatish Balay       _argvec[11] = MIPS64_LONG2REG_CAST(arg11);                  \
65286edef35eSSatish Balay       __asm__ volatile(                                           \
65296edef35eSSatish Balay          "dsubu $29, $29, 24\n\t"                                 \
65306edef35eSSatish Balay          "ld $4, 72(%1)\n\t"                                      \
65316edef35eSSatish Balay          "sd $4, 0($29)\n\t"                                      \
65326edef35eSSatish Balay          "ld $4, 80(%1)\n\t"                                      \
65336edef35eSSatish Balay          "sd $4, 8($29)\n\t"                                      \
65346edef35eSSatish Balay          "ld $4, 88(%1)\n\t"                                      \
65356edef35eSSatish Balay          "sd $4, 16($29)\n\t"                                     \
65366edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
65376edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
65386edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
65396edef35eSSatish Balay          "ld $7, 32(%1)\n\t"                                      \
65406edef35eSSatish Balay          "ld $8, 40(%1)\n\t"                                      \
65416edef35eSSatish Balay          "ld $9, 48(%1)\n\t"                                      \
65426edef35eSSatish Balay          "ld $10, 56(%1)\n\t"                                     \
65436edef35eSSatish Balay          "ld $11, 64(%1)\n\t"                                     \
65446edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
65456edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
65466edef35eSSatish Balay          "daddu $29, $29, 24\n\t"                                 \
65476edef35eSSatish Balay          "move %0, $2\n"                                          \
65486edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
65496edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
65506edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
65516edef35eSSatish Balay       );                                                          \
65526edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
65536edef35eSSatish Balay    } while (0)
65546edef35eSSatish Balay 
65556edef35eSSatish Balay #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
65566edef35eSSatish Balay                                   arg6,arg7,arg8,arg9,arg10,      \
65576edef35eSSatish Balay                                   arg11,arg12)                    \
65586edef35eSSatish Balay    do {                                                           \
65596edef35eSSatish Balay       volatile OrigFn        _orig = (orig);                      \
65606edef35eSSatish Balay       volatile unsigned long long _argvec[13];                    \
65616edef35eSSatish Balay       volatile unsigned long long _res;                           \
65626edef35eSSatish Balay       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
65636edef35eSSatish Balay       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
65646edef35eSSatish Balay       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
65656edef35eSSatish Balay       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
65666edef35eSSatish Balay       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
65676edef35eSSatish Balay       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
65686edef35eSSatish Balay       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
65696edef35eSSatish Balay       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
65706edef35eSSatish Balay       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
65716edef35eSSatish Balay       _argvec[9] = MIPS64_LONG2REG_CAST(arg9);                    \
65726edef35eSSatish Balay       _argvec[10] = MIPS64_LONG2REG_CAST(arg10);                  \
65736edef35eSSatish Balay       _argvec[11] = MIPS64_LONG2REG_CAST(arg11);                  \
65746edef35eSSatish Balay       _argvec[12] = MIPS64_LONG2REG_CAST(arg12);                  \
65756edef35eSSatish Balay       __asm__ volatile(                                           \
65766edef35eSSatish Balay          "dsubu $29, $29, 32\n\t"                                 \
65776edef35eSSatish Balay          "ld $4, 72(%1)\n\t"                                      \
65786edef35eSSatish Balay          "sd $4, 0($29)\n\t"                                      \
65796edef35eSSatish Balay          "ld $4, 80(%1)\n\t"                                      \
65806edef35eSSatish Balay          "sd $4, 8($29)\n\t"                                      \
65816edef35eSSatish Balay          "ld $4, 88(%1)\n\t"                                      \
65826edef35eSSatish Balay          "sd $4, 16($29)\n\t"                                     \
65836edef35eSSatish Balay          "ld $4, 96(%1)\n\t"                                      \
65846edef35eSSatish Balay          "sd $4, 24($29)\n\t"                                     \
65856edef35eSSatish Balay          "ld $4, 8(%1)\n\t"                                       \
65866edef35eSSatish Balay          "ld $5, 16(%1)\n\t"                                      \
65876edef35eSSatish Balay          "ld $6, 24(%1)\n\t"                                      \
65886edef35eSSatish Balay          "ld $7, 32(%1)\n\t"                                      \
65896edef35eSSatish Balay          "ld $8, 40(%1)\n\t"                                      \
65906edef35eSSatish Balay          "ld $9, 48(%1)\n\t"                                      \
65916edef35eSSatish Balay          "ld $10, 56(%1)\n\t"                                     \
65926edef35eSSatish Balay          "ld $11, 64(%1)\n\t"                                     \
65936edef35eSSatish Balay          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
65946edef35eSSatish Balay          VALGRIND_CALL_NOREDIR_T9                                 \
65956edef35eSSatish Balay          "daddu $29, $29, 32\n\t"                                 \
65966edef35eSSatish Balay          "move %0, $2\n"                                          \
65976edef35eSSatish Balay          : /*out*/   "=r" (_res)                                  \
65986edef35eSSatish Balay          : /*in*/    "r" (&_argvec[0])                            \
65996edef35eSSatish Balay          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
66006edef35eSSatish Balay       );                                                          \
66016edef35eSSatish Balay       lval = (__typeof__(lval)) (long)_res;                       \
66026edef35eSSatish Balay    } while (0)
66036edef35eSSatish Balay 
66046edef35eSSatish Balay #endif /* PLAT_mips64_linux */
66056edef35eSSatish Balay 
66066edef35eSSatish Balay /* ------------------------------------------------------------------ */
66076edef35eSSatish Balay /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS.               */
66086edef35eSSatish Balay /*                                                                    */
66096edef35eSSatish Balay /* ------------------------------------------------------------------ */
66106edef35eSSatish Balay 
66116edef35eSSatish Balay /* Some request codes.  There are many more of these, but most are not
66126edef35eSSatish Balay    exposed to end-user view.  These are the public ones, all of the
66136edef35eSSatish Balay    form 0x1000 + small_number.
66146edef35eSSatish Balay 
66156edef35eSSatish Balay    Core ones are in the range 0x00000000--0x0000ffff.  The non-public
66166edef35eSSatish Balay    ones start at 0x2000.
66176edef35eSSatish Balay */
66186edef35eSSatish Balay 
66196edef35eSSatish Balay /* These macros are used by tools -- they must be public, but don't
66206edef35eSSatish Balay    embed them into other programs. */
66216edef35eSSatish Balay #define VG_USERREQ_TOOL_BASE(a,b) \
66226edef35eSSatish Balay    ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
66236edef35eSSatish Balay #define VG_IS_TOOL_USERREQ(a, b, v) \
66246edef35eSSatish Balay    (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
66256edef35eSSatish Balay 
66266edef35eSSatish Balay /* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
66276edef35eSSatish Balay    This enum comprises an ABI exported by Valgrind to programs
66286edef35eSSatish Balay    which use client requests.  DO NOT CHANGE THE NUMERIC VALUES OF THESE
66296edef35eSSatish Balay    ENTRIES, NOR DELETE ANY -- add new ones at the end of the most
66306edef35eSSatish Balay    relevant group. */
66316edef35eSSatish Balay typedef
66326edef35eSSatish Balay    enum { VG_USERREQ__RUNNING_ON_VALGRIND  = 0x1001,
66336edef35eSSatish Balay           VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
66346edef35eSSatish Balay 
66356edef35eSSatish Balay           /* These allow any function to be called from the simulated
66366edef35eSSatish Balay              CPU but run on the real CPU.  Nb: the first arg passed to
66376edef35eSSatish Balay              the function is always the ThreadId of the running
66386edef35eSSatish Balay              thread!  So CLIENT_CALL0 actually requires a 1 arg
66396edef35eSSatish Balay              function, etc. */
66406edef35eSSatish Balay           VG_USERREQ__CLIENT_CALL0 = 0x1101,
66416edef35eSSatish Balay           VG_USERREQ__CLIENT_CALL1 = 0x1102,
66426edef35eSSatish Balay           VG_USERREQ__CLIENT_CALL2 = 0x1103,
66436edef35eSSatish Balay           VG_USERREQ__CLIENT_CALL3 = 0x1104,
66446edef35eSSatish Balay 
66456edef35eSSatish Balay           /* Can be useful in regression testing suites -- eg. can
66466edef35eSSatish Balay              send Valgrind's output to /dev/null and still count
66476edef35eSSatish Balay              errors. */
66486edef35eSSatish Balay           VG_USERREQ__COUNT_ERRORS = 0x1201,
66496edef35eSSatish Balay 
66506edef35eSSatish Balay           /* Allows the client program and/or gdbserver to execute a monitor
66516edef35eSSatish Balay              command. */
66526edef35eSSatish Balay           VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202,
66536edef35eSSatish Balay 
66546edef35eSSatish Balay           /* Allows the client program to change a dynamic command line
66556edef35eSSatish Balay              option.  */
66566edef35eSSatish Balay           VG_USERREQ__CLO_CHANGE = 0x1203,
66576edef35eSSatish Balay 
66586edef35eSSatish Balay           /* These are useful and can be interpreted by any tool that
66596edef35eSSatish Balay              tracks malloc() et al, by using vg_replace_malloc.c. */
66606edef35eSSatish Balay           VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
66616edef35eSSatish Balay           VG_USERREQ__RESIZEINPLACE_BLOCK = 0x130b,
66626edef35eSSatish Balay           VG_USERREQ__FREELIKE_BLOCK   = 0x1302,
66636edef35eSSatish Balay           /* Memory pool support. */
66646edef35eSSatish Balay           VG_USERREQ__CREATE_MEMPOOL   = 0x1303,
66656edef35eSSatish Balay           VG_USERREQ__DESTROY_MEMPOOL  = 0x1304,
66666edef35eSSatish Balay           VG_USERREQ__MEMPOOL_ALLOC    = 0x1305,
66676edef35eSSatish Balay           VG_USERREQ__MEMPOOL_FREE     = 0x1306,
66686edef35eSSatish Balay           VG_USERREQ__MEMPOOL_TRIM     = 0x1307,
66696edef35eSSatish Balay           VG_USERREQ__MOVE_MEMPOOL     = 0x1308,
66706edef35eSSatish Balay           VG_USERREQ__MEMPOOL_CHANGE   = 0x1309,
66716edef35eSSatish Balay           VG_USERREQ__MEMPOOL_EXISTS   = 0x130a,
66726edef35eSSatish Balay 
66736edef35eSSatish Balay           /* Allow printfs to valgrind log. */
66746edef35eSSatish Balay           /* The first two pass the va_list argument by value, which
66756edef35eSSatish Balay              assumes it is the same size as or smaller than a UWord,
66766edef35eSSatish Balay              which generally isn't the case.  Hence are deprecated.
66776edef35eSSatish Balay              The second two pass the vargs by reference and so are
66786edef35eSSatish Balay              immune to this problem. */
66796edef35eSSatish Balay           /* both :: char* fmt, va_list vargs (DEPRECATED) */
66806edef35eSSatish Balay           VG_USERREQ__PRINTF           = 0x1401,
66816edef35eSSatish Balay           VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
66826edef35eSSatish Balay           /* both :: char* fmt, va_list* vargs */
66836edef35eSSatish Balay           VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403,
66846edef35eSSatish Balay           VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404,
66856edef35eSSatish Balay 
66866edef35eSSatish Balay           /* Stack support. */
66876edef35eSSatish Balay           VG_USERREQ__STACK_REGISTER   = 0x1501,
66886edef35eSSatish Balay           VG_USERREQ__STACK_DEREGISTER = 0x1502,
66896edef35eSSatish Balay           VG_USERREQ__STACK_CHANGE     = 0x1503,
66906edef35eSSatish Balay 
66916edef35eSSatish Balay           /* Wine support */
66926edef35eSSatish Balay           VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601,
66936edef35eSSatish Balay 
66946edef35eSSatish Balay           /* Querying of debug info. */
66956edef35eSSatish Balay           VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701,
66966edef35eSSatish Balay 
66976edef35eSSatish Balay           /* Disable/enable error reporting level.  Takes a single
66986edef35eSSatish Balay              Word arg which is the delta to this thread's error
66996edef35eSSatish Balay              disablement indicator.  Hence 1 disables or further
67006edef35eSSatish Balay              disables errors, and -1 moves back towards enablement.
67016edef35eSSatish Balay              Other values are not allowed. */
67026edef35eSSatish Balay           VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801,
67036edef35eSSatish Balay 
67046edef35eSSatish Balay           /* Some requests used for Valgrind internal, such as
67056edef35eSSatish Balay              self-test or self-hosting. */
67066edef35eSSatish Balay           /* Initialise IR injection */
67076edef35eSSatish Balay           VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901,
67086edef35eSSatish Balay           /* Used by Inner Valgrind to inform Outer Valgrind where to
67096edef35eSSatish Balay              find the list of inner guest threads */
67106edef35eSSatish Balay           VG_USERREQ__INNER_THREADS    = 0x1902
67116edef35eSSatish Balay    } Vg_ClientRequest;
67126edef35eSSatish Balay 
67136edef35eSSatish Balay #if !defined(__GNUC__)
67146edef35eSSatish Balay #  define __extension__ /* */
67156edef35eSSatish Balay #endif
67166edef35eSSatish Balay 
67176edef35eSSatish Balay 
67186edef35eSSatish Balay /* Returns the number of Valgrinds this code is running under.  That
67196edef35eSSatish Balay    is, 0 if running natively, 1 if running under Valgrind, 2 if
67206edef35eSSatish Balay    running under Valgrind which is running under another Valgrind,
67216edef35eSSatish Balay    etc. */
67226edef35eSSatish Balay #define RUNNING_ON_VALGRIND                                           \
67236edef35eSSatish Balay     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */,         \
67246edef35eSSatish Balay                                     VG_USERREQ__RUNNING_ON_VALGRIND,  \
67256edef35eSSatish Balay                                     0, 0, 0, 0, 0)                    \
67266edef35eSSatish Balay 
67276edef35eSSatish Balay 
67286edef35eSSatish Balay /* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
67296edef35eSSatish Balay    _qzz_len - 1].  Useful if you are debugging a JITter or some such,
67306edef35eSSatish Balay    since it provides a way to make sure valgrind will retranslate the
67316edef35eSSatish Balay    invalidated area.  Returns no value. */
67326edef35eSSatish Balay #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len)              \
67336edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS,  \
67346edef35eSSatish Balay                                     _qzz_addr, _qzz_len, 0, 0, 0)
67356edef35eSSatish Balay 
67366edef35eSSatish Balay #define VALGRIND_INNER_THREADS(_qzz_addr)                               \
67376edef35eSSatish Balay    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__INNER_THREADS,           \
67386edef35eSSatish Balay                                    _qzz_addr, 0, 0, 0, 0)
67396edef35eSSatish Balay 
67406edef35eSSatish Balay 
67416edef35eSSatish Balay /* These requests are for getting Valgrind itself to print something.
67426edef35eSSatish Balay    Possibly with a backtrace.  This is a really ugly hack.  The return value
67436edef35eSSatish Balay    is the number of characters printed, excluding the "**<pid>** " part at the
67446edef35eSSatish Balay    start and the backtrace (if present). */
67456edef35eSSatish Balay 
67466edef35eSSatish Balay #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
67476edef35eSSatish Balay /* Modern GCC will optimize the static routine out if unused,
67486edef35eSSatish Balay    and unused attribute will shut down warnings about it.  */
67496edef35eSSatish Balay static int VALGRIND_PRINTF(const char *format, ...)
67506edef35eSSatish Balay    __attribute__((format(__printf__, 1, 2), __unused__));
67516edef35eSSatish Balay #endif
67526edef35eSSatish Balay static int
67536edef35eSSatish Balay #if defined(_MSC_VER)
67546edef35eSSatish Balay __inline
67556edef35eSSatish Balay #endif
67566edef35eSSatish Balay VALGRIND_PRINTF(const char *format, ...)
67576edef35eSSatish Balay {
67586edef35eSSatish Balay #if defined(NVALGRIND)
67596edef35eSSatish Balay    (void)format;
67606edef35eSSatish Balay    return 0;
67616edef35eSSatish Balay #else /* NVALGRIND */
67626edef35eSSatish Balay #if defined(_MSC_VER) || defined(__MINGW64__)
67636edef35eSSatish Balay    uintptr_t _qzz_res;
67646edef35eSSatish Balay #else
67656edef35eSSatish Balay    unsigned long _qzz_res;
67666edef35eSSatish Balay #endif
67676edef35eSSatish Balay    va_list vargs;
67686edef35eSSatish Balay    va_start(vargs, format);
67696edef35eSSatish Balay #if defined(_MSC_VER) || defined(__MINGW64__)
67706edef35eSSatish Balay    _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
67716edef35eSSatish Balay                               VG_USERREQ__PRINTF_VALIST_BY_REF,
67726edef35eSSatish Balay                               (uintptr_t)format,
67736edef35eSSatish Balay                               (uintptr_t)&vargs,
67746edef35eSSatish Balay                               0, 0, 0);
67756edef35eSSatish Balay #else
67766edef35eSSatish Balay    _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
67776edef35eSSatish Balay                               VG_USERREQ__PRINTF_VALIST_BY_REF,
67786edef35eSSatish Balay                               (unsigned long)format,
67796edef35eSSatish Balay                               (unsigned long)&vargs,
67806edef35eSSatish Balay                               0, 0, 0);
67816edef35eSSatish Balay #endif
67826edef35eSSatish Balay    va_end(vargs);
67836edef35eSSatish Balay    return (int)_qzz_res;
67846edef35eSSatish Balay #endif /* NVALGRIND */
67856edef35eSSatish Balay }
67866edef35eSSatish Balay 
67876edef35eSSatish Balay #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
67886edef35eSSatish Balay static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
67896edef35eSSatish Balay    __attribute__((format(__printf__, 1, 2), __unused__));
67906edef35eSSatish Balay #endif
67916edef35eSSatish Balay static int
67926edef35eSSatish Balay #if defined(_MSC_VER)
67936edef35eSSatish Balay __inline
67946edef35eSSatish Balay #endif
67956edef35eSSatish Balay VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
67966edef35eSSatish Balay {
67976edef35eSSatish Balay #if defined(NVALGRIND)
67986edef35eSSatish Balay    (void)format;
67996edef35eSSatish Balay    return 0;
68006edef35eSSatish Balay #else /* NVALGRIND */
68016edef35eSSatish Balay #if defined(_MSC_VER) || defined(__MINGW64__)
68026edef35eSSatish Balay    uintptr_t _qzz_res;
68036edef35eSSatish Balay #else
68046edef35eSSatish Balay    unsigned long _qzz_res;
68056edef35eSSatish Balay #endif
68066edef35eSSatish Balay    va_list vargs;
68076edef35eSSatish Balay    va_start(vargs, format);
68086edef35eSSatish Balay #if defined(_MSC_VER) || defined(__MINGW64__)
68096edef35eSSatish Balay    _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
68106edef35eSSatish Balay                               VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
68116edef35eSSatish Balay                               (uintptr_t)format,
68126edef35eSSatish Balay                               (uintptr_t)&vargs,
68136edef35eSSatish Balay                               0, 0, 0);
68146edef35eSSatish Balay #else
68156edef35eSSatish Balay    _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
68166edef35eSSatish Balay                               VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
68176edef35eSSatish Balay                               (unsigned long)format,
68186edef35eSSatish Balay                               (unsigned long)&vargs,
68196edef35eSSatish Balay                               0, 0, 0);
68206edef35eSSatish Balay #endif
68216edef35eSSatish Balay    va_end(vargs);
68226edef35eSSatish Balay    return (int)_qzz_res;
68236edef35eSSatish Balay #endif /* NVALGRIND */
68246edef35eSSatish Balay }
68256edef35eSSatish Balay 
68266edef35eSSatish Balay 
68276edef35eSSatish Balay /* These requests allow control to move from the simulated CPU to the
68286edef35eSSatish Balay    real CPU, calling an arbitrary function.
68296edef35eSSatish Balay 
68306edef35eSSatish Balay    Note that the current ThreadId is inserted as the first argument.
68316edef35eSSatish Balay    So this call:
68326edef35eSSatish Balay 
68336edef35eSSatish Balay      VALGRIND_NON_SIMD_CALL2(f, arg1, arg2)
68346edef35eSSatish Balay 
68356edef35eSSatish Balay    requires f to have this signature:
68366edef35eSSatish Balay 
68376edef35eSSatish Balay      Word f(Word tid, Word arg1, Word arg2)
68386edef35eSSatish Balay 
68396edef35eSSatish Balay    where "Word" is a word-sized type.
68406edef35eSSatish Balay 
68416edef35eSSatish Balay    Note that these client requests are not entirely reliable.  For example,
68426edef35eSSatish Balay    if you call a function with them that subsequently calls printf(),
68436edef35eSSatish Balay    there's a high chance Valgrind will crash.  Generally, your prospects of
68446edef35eSSatish Balay    these working are made higher if the called function does not refer to
68456edef35eSSatish Balay    any global variables, and does not refer to any libc or other functions
68466edef35eSSatish Balay    (printf et al).  Any kind of entanglement with libc or dynamic linking is
68476edef35eSSatish Balay    likely to have a bad outcome, for tricky reasons which we've grappled
68486edef35eSSatish Balay    with a lot in the past.
68496edef35eSSatish Balay */
68506edef35eSSatish Balay #define VALGRIND_NON_SIMD_CALL0(_qyy_fn)                          \
68516edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,       \
68526edef35eSSatish Balay                                     VG_USERREQ__CLIENT_CALL0,     \
68536edef35eSSatish Balay                                     _qyy_fn,                      \
68546edef35eSSatish Balay                                     0, 0, 0, 0)
68556edef35eSSatish Balay 
68566edef35eSSatish Balay #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1)                    \
68576edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,            \
68586edef35eSSatish Balay                                     VG_USERREQ__CLIENT_CALL1,          \
68596edef35eSSatish Balay                                     _qyy_fn,                           \
68606edef35eSSatish Balay                                     _qyy_arg1, 0, 0, 0)
68616edef35eSSatish Balay 
68626edef35eSSatish Balay #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2)         \
68636edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,            \
68646edef35eSSatish Balay                                     VG_USERREQ__CLIENT_CALL2,          \
68656edef35eSSatish Balay                                     _qyy_fn,                           \
68666edef35eSSatish Balay                                     _qyy_arg1, _qyy_arg2, 0, 0)
68676edef35eSSatish Balay 
68686edef35eSSatish Balay #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
68696edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,             \
68706edef35eSSatish Balay                                     VG_USERREQ__CLIENT_CALL3,           \
68716edef35eSSatish Balay                                     _qyy_fn,                            \
68726edef35eSSatish Balay                                     _qyy_arg1, _qyy_arg2,               \
68736edef35eSSatish Balay                                     _qyy_arg3, 0)
68746edef35eSSatish Balay 
68756edef35eSSatish Balay 
68766edef35eSSatish Balay /* Counts the number of errors that have been recorded by a tool.  Nb:
68776edef35eSSatish Balay    the tool must record the errors with VG_(maybe_record_error)() or
68786edef35eSSatish Balay    VG_(unique_error)() for them to be counted. */
68796edef35eSSatish Balay #define VALGRIND_COUNT_ERRORS                                     \
68806edef35eSSatish Balay     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(                    \
68816edef35eSSatish Balay                                0 /* default return */,            \
68826edef35eSSatish Balay                                VG_USERREQ__COUNT_ERRORS,          \
68836edef35eSSatish Balay                                0, 0, 0, 0, 0)
68846edef35eSSatish Balay 
68856edef35eSSatish Balay /* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing
68866edef35eSSatish Balay    when heap blocks are allocated in order to give accurate results.  This
68876edef35eSSatish Balay    happens automatically for the standard allocator functions such as
68886edef35eSSatish Balay    malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete,
68896edef35eSSatish Balay    delete[], etc.
68906edef35eSSatish Balay 
68916edef35eSSatish Balay    But if your program uses a custom allocator, this doesn't automatically
68926edef35eSSatish Balay    happen, and Valgrind will not do as well.  For example, if you allocate
68936edef35eSSatish Balay    superblocks with mmap() and then allocates chunks of the superblocks, all
68946edef35eSSatish Balay    Valgrind's observations will be at the mmap() level and it won't know that
68956edef35eSSatish Balay    the chunks should be considered separate entities.  In Memcheck's case,
68966edef35eSSatish Balay    that means you probably won't get heap block overrun detection (because
68976edef35eSSatish Balay    there won't be redzones marked as unaddressable) and you definitely won't
68986edef35eSSatish Balay    get any leak detection.
68996edef35eSSatish Balay 
69006edef35eSSatish Balay    The following client requests allow a custom allocator to be annotated so
69016edef35eSSatish Balay    that it can be handled accurately by Valgrind.
69026edef35eSSatish Balay 
69036edef35eSSatish Balay    VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated
69046edef35eSSatish Balay    by a malloc()-like function.  For Memcheck (an illustrative case), this
69056edef35eSSatish Balay    does two things:
69066edef35eSSatish Balay 
69076edef35eSSatish Balay    - It records that the block has been allocated.  This means any addresses
69086edef35eSSatish Balay      within the block mentioned in error messages will be
69096edef35eSSatish Balay      identified as belonging to the block.  It also means that if the block
69106edef35eSSatish Balay      isn't freed it will be detected by the leak checker.
69116edef35eSSatish Balay 
69126edef35eSSatish Balay    - It marks the block as being addressable and undefined (if 'is_zeroed' is
69136edef35eSSatish Balay      not set), or addressable and defined (if 'is_zeroed' is set).  This
69146edef35eSSatish Balay      controls how accesses to the block by the program are handled.
69156edef35eSSatish Balay 
69166edef35eSSatish Balay    'addr' is the start of the usable block (ie. after any
69176edef35eSSatish Balay    redzone), 'sizeB' is its size.  'rzB' is the redzone size if the allocator
69186edef35eSSatish Balay    can apply redzones -- these are blocks of padding at the start and end of
69196edef35eSSatish Balay    each block.  Adding redzones is recommended as it makes it much more likely
69206edef35eSSatish Balay    Valgrind will spot block overruns.  `is_zeroed' indicates if the memory is
69216edef35eSSatish Balay    zeroed (or filled with another predictable value), as is the case for
69226edef35eSSatish Balay    calloc().
69236edef35eSSatish Balay 
69246edef35eSSatish Balay    VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a
69256edef35eSSatish Balay    heap block -- that will be used by the client program -- is allocated.
69266edef35eSSatish Balay    It's best to put it at the outermost level of the allocator if possible;
69276edef35eSSatish Balay    for example, if you have a function my_alloc() which calls
69286edef35eSSatish Balay    internal_alloc(), and the client request is put inside internal_alloc(),
69296edef35eSSatish Balay    stack traces relating to the heap block will contain entries for both
69306edef35eSSatish Balay    my_alloc() and internal_alloc(), which is probably not what you want.
69316edef35eSSatish Balay 
69326edef35eSSatish Balay    For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out
69336edef35eSSatish Balay    custom blocks from within a heap block, B, that has been allocated with
69346edef35eSSatish Balay    malloc/calloc/new/etc, then block B will be *ignored* during leak-checking
69356edef35eSSatish Balay    -- the custom blocks will take precedence.
69366edef35eSSatish Balay 
69376edef35eSSatish Balay    VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK.  For
69386edef35eSSatish Balay    Memcheck, it does two things:
69396edef35eSSatish Balay 
69406edef35eSSatish Balay    - It records that the block has been deallocated.  This assumes that the
69416edef35eSSatish Balay      block was annotated as having been allocated via
69426edef35eSSatish Balay      VALGRIND_MALLOCLIKE_BLOCK.  Otherwise, an error will be issued.
69436edef35eSSatish Balay 
69446edef35eSSatish Balay    - It marks the block as being unaddressable.
69456edef35eSSatish Balay 
69466edef35eSSatish Balay    VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a
69476edef35eSSatish Balay    heap block is deallocated.
69486edef35eSSatish Balay 
69496edef35eSSatish Balay    VALGRIND_RESIZEINPLACE_BLOCK informs a tool about reallocation. For
69506edef35eSSatish Balay    Memcheck, it does four things:
69516edef35eSSatish Balay 
69526edef35eSSatish Balay    - It records that the size of a block has been changed.  This assumes that
69536edef35eSSatish Balay      the block was annotated as having been allocated via
69546edef35eSSatish Balay      VALGRIND_MALLOCLIKE_BLOCK.  Otherwise, an error will be issued.
69556edef35eSSatish Balay 
69566edef35eSSatish Balay    - If the block shrunk, it marks the freed memory as being unaddressable.
69576edef35eSSatish Balay 
69586edef35eSSatish Balay    - If the block grew, it marks the new area as undefined and defines a red
69596edef35eSSatish Balay      zone past the end of the new block.
69606edef35eSSatish Balay 
69616edef35eSSatish Balay    - The V-bits of the overlap between the old and the new block are preserved.
69626edef35eSSatish Balay 
69636edef35eSSatish Balay    VALGRIND_RESIZEINPLACE_BLOCK should be put after allocation of the new block
69646edef35eSSatish Balay    and before deallocation of the old block.
69656edef35eSSatish Balay 
69666edef35eSSatish Balay    In many cases, these three client requests will not be enough to get your
69676edef35eSSatish Balay    allocator working well with Memcheck.  More specifically, if your allocator
69686edef35eSSatish Balay    writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call
69696edef35eSSatish Balay    will be necessary to mark the memory as addressable just before the zeroing
69706edef35eSSatish Balay    occurs, otherwise you'll get a lot of invalid write errors.  For example,
69716edef35eSSatish Balay    you'll need to do this if your allocator recycles freed blocks, but it
69726edef35eSSatish Balay    zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK).
69736edef35eSSatish Balay    Alternatively, if your allocator reuses freed blocks for allocator-internal
69746edef35eSSatish Balay    data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary.
69756edef35eSSatish Balay 
69766edef35eSSatish Balay    Really, what's happening is a blurring of the lines between the client
69776edef35eSSatish Balay    program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the
69786edef35eSSatish Balay    memory should be considered unaddressable to the client program, but the
69796edef35eSSatish Balay    allocator knows more than the rest of the client program and so may be able
69806edef35eSSatish Balay    to safely access it.  Extra client requests are necessary for Valgrind to
69816edef35eSSatish Balay    understand the distinction between the allocator and the rest of the
69826edef35eSSatish Balay    program.
69836edef35eSSatish Balay 
69846edef35eSSatish Balay    Ignored if addr == 0.
69856edef35eSSatish Balay */
69866edef35eSSatish Balay #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)          \
69876edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK,       \
69886edef35eSSatish Balay                                     addr, sizeB, rzB, is_zeroed, 0)
69896edef35eSSatish Balay 
69906edef35eSSatish Balay /* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
69916edef35eSSatish Balay    Ignored if addr == 0.
69926edef35eSSatish Balay */
69936edef35eSSatish Balay #define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB)     \
69946edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK,    \
69956edef35eSSatish Balay                                     addr, oldSizeB, newSizeB, rzB, 0)
69966edef35eSSatish Balay 
69976edef35eSSatish Balay /* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
69986edef35eSSatish Balay    Ignored if addr == 0.
69996edef35eSSatish Balay */
70006edef35eSSatish Balay #define VALGRIND_FREELIKE_BLOCK(addr, rzB)                              \
70016edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK,         \
70026edef35eSSatish Balay                                     addr, rzB, 0, 0, 0)
70036edef35eSSatish Balay 
70046edef35eSSatish Balay /* Create a memory pool. */
70056edef35eSSatish Balay #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed)             \
70066edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL,   \
70076edef35eSSatish Balay                                     pool, rzB, is_zeroed, 0, 0)
70086edef35eSSatish Balay 
70096edef35eSSatish Balay /* Create a memory pool with some flags specifying extended behaviour.
70106edef35eSSatish Balay    When flags is zero, the behaviour is identical to VALGRIND_CREATE_MEMPOOL.
70116edef35eSSatish Balay 
70126edef35eSSatish Balay    The flag VALGRIND_MEMPOOL_METAPOOL specifies that the pieces of memory
70136edef35eSSatish Balay    associated with the pool using VALGRIND_MEMPOOL_ALLOC  will be used
70146edef35eSSatish Balay    by the application as superblocks to dole out MALLOC_LIKE blocks using
70156edef35eSSatish Balay    VALGRIND_MALLOCLIKE_BLOCK. In other words, a meta pool is a "2 levels"
70166edef35eSSatish Balay    pool : first level is the blocks described by VALGRIND_MEMPOOL_ALLOC.
70176edef35eSSatish Balay    The second level blocks are described using VALGRIND_MALLOCLIKE_BLOCK.
70186edef35eSSatish Balay    Note that the association between the pool and the second level blocks
70196edef35eSSatish Balay    is implicit : second level blocks will be located inside first level
70206edef35eSSatish Balay    blocks. It is necessary to use the VALGRIND_MEMPOOL_METAPOOL flag
70216edef35eSSatish Balay    for such 2 levels pools, as otherwise valgrind will detect overlapping
70226edef35eSSatish Balay    memory blocks, and will abort execution (e.g. during leak search).
70236edef35eSSatish Balay 
70246edef35eSSatish Balay    Such a meta pool can also be marked as an 'auto free' pool using the flag
70256edef35eSSatish Balay    VALGRIND_MEMPOOL_AUTO_FREE, which must be OR-ed together with the
70266edef35eSSatish Balay    VALGRIND_MEMPOOL_METAPOOL. For an 'auto free' pool, VALGRIND_MEMPOOL_FREE
70276edef35eSSatish Balay    will automatically free the second level blocks that are contained
70286edef35eSSatish Balay    inside the first level block freed with VALGRIND_MEMPOOL_FREE.
70296edef35eSSatish Balay    In other words, calling VALGRIND_MEMPOOL_FREE will cause implicit calls
70306edef35eSSatish Balay    to VALGRIND_FREELIKE_BLOCK for all the second level blocks included
70316edef35eSSatish Balay    in the first level block.
70326edef35eSSatish Balay    Note: it is an error to use the VALGRIND_MEMPOOL_AUTO_FREE flag
70336edef35eSSatish Balay    without the VALGRIND_MEMPOOL_METAPOOL flag.
70346edef35eSSatish Balay */
70356edef35eSSatish Balay #define VALGRIND_MEMPOOL_AUTO_FREE  1
70366edef35eSSatish Balay #define VALGRIND_MEMPOOL_METAPOOL   2
70376edef35eSSatish Balay #define VALGRIND_CREATE_MEMPOOL_EXT(pool, rzB, is_zeroed, flags)        \
70386edef35eSSatish Balay    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL,          \
70396edef35eSSatish Balay                                    pool, rzB, is_zeroed, flags, 0)
70406edef35eSSatish Balay 
70416edef35eSSatish Balay /* Destroy a memory pool. */
70426edef35eSSatish Balay #define VALGRIND_DESTROY_MEMPOOL(pool)                            \
70436edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL,  \
70446edef35eSSatish Balay                                     pool, 0, 0, 0, 0)
70456edef35eSSatish Balay 
70466edef35eSSatish Balay /* Associate a piece of memory with a memory pool. */
70476edef35eSSatish Balay #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size)                  \
70486edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC,    \
70496edef35eSSatish Balay                                     pool, addr, size, 0, 0)
70506edef35eSSatish Balay 
70516edef35eSSatish Balay /* Disassociate a piece of memory from a memory pool. */
70526edef35eSSatish Balay #define VALGRIND_MEMPOOL_FREE(pool, addr)                         \
70536edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE,     \
70546edef35eSSatish Balay                                     pool, addr, 0, 0, 0)
70556edef35eSSatish Balay 
70566edef35eSSatish Balay /* Disassociate any pieces outside a particular range. */
70576edef35eSSatish Balay #define VALGRIND_MEMPOOL_TRIM(pool, addr, size)                   \
70586edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM,     \
70596edef35eSSatish Balay                                     pool, addr, size, 0, 0)
70606edef35eSSatish Balay 
70616edef35eSSatish Balay /* Resize and/or move a piece associated with a memory pool. */
70626edef35eSSatish Balay #define VALGRIND_MOVE_MEMPOOL(poolA, poolB)                       \
70636edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL,     \
70646edef35eSSatish Balay                                     poolA, poolB, 0, 0, 0)
70656edef35eSSatish Balay 
70666edef35eSSatish Balay /* Resize and/or move a piece associated with a memory pool. */
70676edef35eSSatish Balay #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size)         \
70686edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE,   \
70696edef35eSSatish Balay                                     pool, addrA, addrB, size, 0)
70706edef35eSSatish Balay 
70716edef35eSSatish Balay /* Return 1 if a mempool exists, else 0. */
70726edef35eSSatish Balay #define VALGRIND_MEMPOOL_EXISTS(pool)                             \
70736edef35eSSatish Balay     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                  \
70746edef35eSSatish Balay                                VG_USERREQ__MEMPOOL_EXISTS,        \
70756edef35eSSatish Balay                                pool, 0, 0, 0, 0)
70766edef35eSSatish Balay 
70776edef35eSSatish Balay /* Mark a piece of memory as being a stack. Returns a stack id.
70786edef35eSSatish Balay    start is the lowest addressable stack byte, end is the highest
70796edef35eSSatish Balay    addressable stack byte. */
70806edef35eSSatish Balay #define VALGRIND_STACK_REGISTER(start, end)                       \
70816edef35eSSatish Balay     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                  \
70826edef35eSSatish Balay                                VG_USERREQ__STACK_REGISTER,        \
70836edef35eSSatish Balay                                start, end, 0, 0, 0)
70846edef35eSSatish Balay 
70856edef35eSSatish Balay /* Unmark the piece of memory associated with a stack id as being a
70866edef35eSSatish Balay    stack. */
70876edef35eSSatish Balay #define VALGRIND_STACK_DEREGISTER(id)                             \
70886edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \
70896edef35eSSatish Balay                                     id, 0, 0, 0, 0)
70906edef35eSSatish Balay 
70916edef35eSSatish Balay /* Change the start and end address of the stack id.
70926edef35eSSatish Balay    start is the new lowest addressable stack byte, end is the new highest
70936edef35eSSatish Balay    addressable stack byte. */
70946edef35eSSatish Balay #define VALGRIND_STACK_CHANGE(id, start, end)                     \
70956edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE,     \
70966edef35eSSatish Balay                                     id, start, end, 0, 0)
70976edef35eSSatish Balay 
70986edef35eSSatish Balay /* Load PDB debug info for Wine PE image_map. */
70996edef35eSSatish Balay #define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta)     \
71006edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \
71016edef35eSSatish Balay                                     fd, ptr, total_size, delta, 0)
71026edef35eSSatish Balay 
71036edef35eSSatish Balay /* Map a code address to a source file name and line number.  buf64
71046edef35eSSatish Balay    must point to a 64-byte buffer in the caller's address space.  The
71056edef35eSSatish Balay    result will be dumped in there and is guaranteed to be zero
71066edef35eSSatish Balay    terminated.  If no info is found, the first byte is set to zero. */
71076edef35eSSatish Balay #define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64)                    \
71086edef35eSSatish Balay     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                  \
71096edef35eSSatish Balay                                VG_USERREQ__MAP_IP_TO_SRCLOC,      \
71106edef35eSSatish Balay                                addr, buf64, 0, 0, 0)
71116edef35eSSatish Balay 
71126edef35eSSatish Balay /* Disable error reporting for this thread.  Behaves in a stack like
71136edef35eSSatish Balay    way, so you can safely call this multiple times provided that
71146edef35eSSatish Balay    VALGRIND_ENABLE_ERROR_REPORTING is called the same number of times
71156edef35eSSatish Balay    to re-enable reporting.  The first call of this macro disables
71166edef35eSSatish Balay    reporting.  Subsequent calls have no effect except to increase the
71176edef35eSSatish Balay    number of VALGRIND_ENABLE_ERROR_REPORTING calls needed to re-enable
71186edef35eSSatish Balay    reporting.  Child threads do not inherit this setting from their
71196edef35eSSatish Balay    parents -- they are always created with reporting enabled. */
71206edef35eSSatish Balay #define VALGRIND_DISABLE_ERROR_REPORTING                                \
71216edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
71226edef35eSSatish Balay                                     1, 0, 0, 0, 0)
71236edef35eSSatish Balay 
71246edef35eSSatish Balay /* Re-enable error reporting, as per comments on
71256edef35eSSatish Balay    VALGRIND_DISABLE_ERROR_REPORTING. */
71266edef35eSSatish Balay #define VALGRIND_ENABLE_ERROR_REPORTING                                 \
71276edef35eSSatish Balay     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
71286edef35eSSatish Balay                                     -1, 0, 0, 0, 0)
71296edef35eSSatish Balay 
71306edef35eSSatish Balay /* Execute a monitor command from the client program.
71316edef35eSSatish Balay    If a connection is opened with GDB, the output will be sent
71326edef35eSSatish Balay    according to the output mode set for vgdb.
71336edef35eSSatish Balay    If no connection is opened, output will go to the log output.
71346edef35eSSatish Balay    Returns 1 if command not recognised, 0 otherwise. */
71356edef35eSSatish Balay #define VALGRIND_MONITOR_COMMAND(command)                               \
71366edef35eSSatish Balay    VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \
71376edef35eSSatish Balay                                    command, 0, 0, 0, 0)
71386edef35eSSatish Balay 
71396edef35eSSatish Balay 
71406edef35eSSatish Balay /* Change the value of a dynamic command line option.
71416edef35eSSatish Balay    Note that unknown or not dynamically changeable options
71426edef35eSSatish Balay    will cause a warning message to be output.  */
71436edef35eSSatish Balay #define VALGRIND_CLO_CHANGE(option)                           \
71446edef35eSSatish Balay    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CLO_CHANGE, \
71456edef35eSSatish Balay                                    option, 0, 0, 0, 0)
71466edef35eSSatish Balay 
71476edef35eSSatish Balay 
71486edef35eSSatish Balay #undef PLAT_x86_darwin
71496edef35eSSatish Balay #undef PLAT_amd64_darwin
71506edef35eSSatish Balay #undef PLAT_x86_win32
71516edef35eSSatish Balay #undef PLAT_amd64_win64
71526edef35eSSatish Balay #undef PLAT_x86_linux
71536edef35eSSatish Balay #undef PLAT_amd64_linux
71546edef35eSSatish Balay #undef PLAT_ppc32_linux
71556edef35eSSatish Balay #undef PLAT_ppc64be_linux
71566edef35eSSatish Balay #undef PLAT_ppc64le_linux
71576edef35eSSatish Balay #undef PLAT_arm_linux
71586edef35eSSatish Balay #undef PLAT_s390x_linux
71596edef35eSSatish Balay #undef PLAT_mips32_linux
71606edef35eSSatish Balay #undef PLAT_mips64_linux
71616edef35eSSatish Balay #undef PLAT_nanomips_linux
71626edef35eSSatish Balay #undef PLAT_x86_solaris
71636edef35eSSatish Balay #undef PLAT_amd64_solaris
71646edef35eSSatish Balay 
71656edef35eSSatish Balay #endif   /* __VALGRIND_H */
7166