15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* -*- c -*-
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ----------------------------------------------------------------
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Notice that the following BSD-style license applies to this one
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   file (valgrind.h) only.  The rest of Valgrind is licensed under the
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   terms of the GNU General Public License, version 2, unless
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   otherwise indicated.  See the COPYING file in the source
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   distribution for details.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ----------------------------------------------------------------
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   This file is part of Valgrind, a dynamic binary instrumentation
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   framework.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Copyright (C) 2000-2008 Julian Seward.  All rights reserved.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Redistribution and use in source and binary forms, with or without
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   modification, are permitted provided that the following conditions
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   are met:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   1. Redistributions of source code must retain the above copyright
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notice, this list of conditions and the following disclaimer.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   2. The origin of this software must not be misrepresented; you must
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      not claim that you wrote the original software.  If you use this
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      software in a product, an acknowledgment in the product
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      documentation would be appreciated but is not required.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   3. Altered source versions must be plainly marked as such, and must
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      not be misrepresented as being the original software.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   4. The name of the author may not be used to endorse or promote
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      products derived from this software without specific prior written
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      permission.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ----------------------------------------------------------------
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Notice that the above BSD-style license applies to this one file
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   (valgrind.h) only.  The entire rest of Valgrind is licensed under
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   the terms of the GNU General Public License, version 2.  See the
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   COPYING file in the source distribution for details.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ----------------------------------------------------------------
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This file is for inclusion into client (your!) code.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   You can use these macros to manipulate and query Valgrind's
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   execution inside your own programs.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   The resulting executables will still run without Valgrind, just a
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   little bit more slowly than they otherwise would, but otherwise
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unchanged.  When not running on valgrind, each client request
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   consumes very few (eg. 7) instructions, so the resulting performance
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   loss is negligible unless you plan to execute client requests
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   millions of times per second.  Nevertheless, if that is still a
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   problem, you can compile with the NVALGRIND symbol defined (gcc
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   -DNVALGRIND) so that client requests are not even compiled in.  */
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef __VALGRIND_H
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __VALGRIND_H
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h>
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Nb: this file might be included in a file compiled with -ansi.  So
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   we can't use C++ style "//" comments nor the "asm" keyword (instead
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   use "__asm__"). */
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Derive some tags indicating what the target platform is.  Note
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   that in this file we're using the compiler's CPP symbols for
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   identifying architectures, which are different to the ones we use
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   within the rest of Valgrind.  Note, __powerpc__ is active for both
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   32 and 64-bit PPC, whereas __powerpc64__ is only active for the
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   latter (on Linux, that is). */
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_x86_linux
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_amd64_linux
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc32_linux
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc64_linux
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc32_aix5
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc64_aix5
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_AIX) && defined(__i386__)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define PLAT_x86_linux 1
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif !defined(_AIX) && defined(__x86_64__)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define PLAT_amd64_linux 1
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif !defined(_AIX) && defined(__powerpc__) && !defined(__powerpc64__)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define PLAT_ppc32_linux 1
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif !defined(_AIX) && defined(__powerpc__) && defined(__powerpc64__)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define PLAT_ppc64_linux 1
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(_AIX) && defined(__64BIT__)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define PLAT_ppc64_aix5 1
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(_AIX) && !defined(__64BIT__)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define PLAT_ppc32_aix5 1
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* If we're not compiling for our target platform, don't generate
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   any inline asms.  */
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PLAT_x86_linux) && !defined(PLAT_amd64_linux) \
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    && !defined(PLAT_ppc32_linux) && !defined(PLAT_ppc64_linux) \
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    && !defined(PLAT_ppc32_aix5) && !defined(PLAT_ppc64_aix5)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  if !defined(NVALGRIND)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define NVALGRIND 1
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS.  There is nothing */
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* in here of use to end-users -- skip to the next section.           */
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NVALGRIND)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Define NVALGRIND to completely remove the Valgrind magic sequence
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   from the compiled code (analogous to NDEBUG's effects on
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert()) */
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST(                               \
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_rlval, _zzq_default, _zzq_request,                   \
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {                                                              \
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (_zzq_rlval) = (_zzq_default);                              \
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else  /* ! NVALGRIND */
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following defines the magic code sequences which the JITter
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   spots and handles magically.  Don't look too closely at them as
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   they will rot your brain.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   The assembly code sequences for all architectures is in this one
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   file.  This is because this file must be stand-alone, and we don't
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   want to have multiple files.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   value gets put in the return slot, so that everything works when
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   this is executed not under Valgrind.  Args are passed in a memory
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   block, and so there's no intrinsic limit to the number that could
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   be passed, but it's currently five.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   The macro args are:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _zzq_rlval    result lvalue
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _zzq_default  default value (result returned when running on real CPU)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _zzq_request  request code
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _zzq_arg1..5  request params
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   The other two macros are used to support function wrapping, and are
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   a lot simpler.  VALGRIND_GET_NR_CONTEXT returns the value of the
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   guest's NRADDR pseudo-register and whatever other information is
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   needed to safely run the call original from the wrapper: on
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ppc64-linux, the R2 value at the divert point is also needed.  This
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   information is abstracted into a user-visible type, OrigFn.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VALGRIND_CALL_NOREDIR_* behaves the same as the following on the
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   guest, but guarantees that the branch instruction will not be
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   branch-and-link-to-r11.  VALGRIND_CALL_NOREDIR is just text, not a
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   complete inline asm, since it needs to be combined with more magic
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   inline asm stuff to be useful.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------- x86-linux ------------------------- */
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_x86_linux)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int nraddr; /* where's the code? */
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   OrigFn;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "roll $3,  %%edi ; roll $13, %%edi\n\t"      \
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "roll $29, %%edi ; roll $19, %%edi\n\t"
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST(                               \
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_rlval, _zzq_default, _zzq_request,                   \
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { volatile unsigned int _zzq_args[6];                           \
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile unsigned int _zzq_result;                            \
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %EDX = client_request ( %EAX ) */         \
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "xchgl %%ebx,%%ebx"                          \
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=d" (_zzq_result)                         \
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "cc", "memory"                             \
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_rlval = _zzq_result;                                     \
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile unsigned int __addr;                                 \
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %EAX = guest_NRADDR */                    \
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "xchgl %%ecx,%%ecx"                          \
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=a" (__addr)                              \
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :                                            \
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "cc", "memory"                             \
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_orig->nraddr = __addr;                                   \
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_CALL_NOREDIR_EAX                                 \
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     __SPECIAL_INSTRUCTION_PREAMBLE               \
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* call-noredir *%EAX */                     \
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "xchgl %%edx,%%edx\n\t"
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_x86_linux */
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ amd64-linux ------------------------ */
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_amd64_linux)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned long long int nraddr; /* where's the code? */
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   OrigFn;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rolq $3,  %%rdi ; rolq $13, %%rdi\n\t"      \
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST(                               \
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_rlval, _zzq_default, _zzq_request,                   \
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { volatile unsigned long long int _zzq_args[6];                 \
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile unsigned long long int _zzq_result;                  \
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[0] = (unsigned long long int)(_zzq_request);        \
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[1] = (unsigned long long int)(_zzq_arg1);           \
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[2] = (unsigned long long int)(_zzq_arg2);           \
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[3] = (unsigned long long int)(_zzq_arg3);           \
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[4] = (unsigned long long int)(_zzq_arg4);           \
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[5] = (unsigned long long int)(_zzq_arg5);           \
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %RDX = client_request ( %RAX ) */         \
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "xchgq %%rbx,%%rbx"                          \
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=d" (_zzq_result)                         \
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "cc", "memory"                             \
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_rlval = _zzq_result;                                     \
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile unsigned long long int __addr;                       \
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %RAX = guest_NRADDR */                    \
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "xchgq %%rcx,%%rcx"                          \
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=a" (__addr)                              \
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :                                            \
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "cc", "memory"                             \
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_orig->nraddr = __addr;                                   \
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_CALL_NOREDIR_RAX                                 \
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     __SPECIAL_INSTRUCTION_PREAMBLE               \
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* call-noredir *%RAX */                     \
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "xchgq %%rdx,%%rdx\n\t"
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_amd64_linux */
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc32-linux ------------------------ */
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc32_linux)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int nraddr; /* where's the code? */
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   OrigFn;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rlwinm 0,0,3,0,0  ; rlwinm 0,0,13,0,0\n\t"  \
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST(                               \
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_rlval, _zzq_default, _zzq_request,                   \
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                  \
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {          unsigned int  _zzq_args[6];                          \
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             unsigned int  _zzq_result;                           \
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             unsigned int* _zzq_ptr;                              \
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_ptr = _zzq_args;                                         \
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "mr 4,%2\n\t" /*ptr*/                        \
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     __SPECIAL_INSTRUCTION_PREAMBLE               \
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = client_request ( %R4 ) */           \
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 1,1,1\n\t"                               \
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "mr %0,3"     /*result*/                     \
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=b" (_zzq_result)                         \
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "b" (_zzq_default), "b" (_zzq_ptr)         \
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "cc", "memory", "r3", "r4");               \
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_rlval = _zzq_result;                                     \
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int __addr;                                          \
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = guest_NRADDR */                     \
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 2,2,2\n\t"                               \
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "mr %0,3"                                    \
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=b" (__addr)                              \
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :                                            \
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "cc", "memory", "r3"                       \
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_orig->nraddr = __addr;                                   \
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     __SPECIAL_INSTRUCTION_PREAMBLE               \
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* branch-and-link-to-noredir *%R11 */       \
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 3,3,3\n\t"
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc32_linux */
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc64-linux ------------------------ */
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc64_linux)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned long long int nraddr; /* where's the code? */
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned long long int r2;  /* what tocptr do we need? */
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   OrigFn;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST(                               \
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_rlval, _zzq_default, _zzq_request,                   \
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                  \
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {          unsigned long long int  _zzq_args[6];                \
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register unsigned long long int  _zzq_result __asm__("r3");   \
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register unsigned long long int* _zzq_ptr __asm__("r4");      \
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[0] = (unsigned long long int)(_zzq_request);        \
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[1] = (unsigned long long int)(_zzq_arg1);           \
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[2] = (unsigned long long int)(_zzq_arg2);           \
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[3] = (unsigned long long int)(_zzq_arg3);           \
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[4] = (unsigned long long int)(_zzq_arg4);           \
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[5] = (unsigned long long int)(_zzq_arg5);           \
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_ptr = _zzq_args;                                         \
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = client_request ( %R4 ) */           \
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 1,1,1"                                   \
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=r" (_zzq_result)                         \
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "0" (_zzq_default), "r" (_zzq_ptr)         \
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "cc", "memory");                           \
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_rlval = _zzq_result;                                     \
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register unsigned long long int __addr __asm__("r3");         \
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = guest_NRADDR */                     \
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 2,2,2"                                   \
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=r" (__addr)                              \
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :                                            \
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "cc", "memory"                             \
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_orig->nraddr = __addr;                                   \
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = guest_NRADDR_GPR2 */                \
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 4,4,4"                                   \
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=r" (__addr)                              \
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :                                            \
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "cc", "memory"                             \
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_orig->r2 = __addr;                                       \
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     __SPECIAL_INSTRUCTION_PREAMBLE               \
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* branch-and-link-to-noredir *%R11 */       \
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 3,3,3\n\t"
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc64_linux */
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc32-aix5 ------------------------- */
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc32_aix5)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int nraddr; /* where's the code? */
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int r2;  /* what tocptr do we need? */
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   OrigFn;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rlwinm 0,0,3,0,0  ; rlwinm 0,0,13,0,0\n\t"  \
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST(                               \
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_rlval, _zzq_default, _zzq_request,                   \
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                  \
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {          unsigned int  _zzq_args[7];                          \
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register unsigned int  _zzq_result;                           \
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register unsigned int* _zzq_ptr;                              \
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[6] = (unsigned int)(_zzq_default);                  \
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_ptr = _zzq_args;                                         \
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile("mr 4,%1\n\t"                                \
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "lwz 3, 24(4)\n\t"                           \
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     __SPECIAL_INSTRUCTION_PREAMBLE               \
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = client_request ( %R4 ) */           \
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 1,1,1\n\t"                               \
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "mr %0,3"                                    \
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=b" (_zzq_result)                         \
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "b" (_zzq_ptr)                             \
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "r3", "r4", "cc", "memory");               \
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_rlval = _zzq_result;                                     \
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register unsigned int __addr;                                 \
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = guest_NRADDR */                     \
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 2,2,2\n\t"                               \
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "mr %0,3"                                    \
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=b" (__addr)                              \
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :                                            \
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "r3", "cc", "memory"                       \
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_orig->nraddr = __addr;                                   \
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = guest_NRADDR_GPR2 */                \
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 4,4,4\n\t"                               \
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "mr %0,3"                                    \
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=b" (__addr)                              \
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :                                            \
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "r3", "cc", "memory"                       \
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_orig->r2 = __addr;                                       \
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     __SPECIAL_INSTRUCTION_PREAMBLE               \
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* branch-and-link-to-noredir *%R11 */       \
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 3,3,3\n\t"
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc32_aix5 */
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc64-aix5 ------------------------- */
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc64_aix5)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned long long int nraddr; /* where's the code? */
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned long long int r2;  /* what tocptr do we need? */
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   OrigFn;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST(                               \
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_rlval, _zzq_default, _zzq_request,                   \
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                  \
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {          unsigned long long int  _zzq_args[7];                \
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register unsigned long long int  _zzq_result;                 \
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register unsigned long long int* _zzq_ptr;                    \
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[0] = (unsigned int long long)(_zzq_request);        \
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[1] = (unsigned int long long)(_zzq_arg1);           \
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[2] = (unsigned int long long)(_zzq_arg2);           \
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[3] = (unsigned int long long)(_zzq_arg3);           \
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[4] = (unsigned int long long)(_zzq_arg4);           \
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[5] = (unsigned int long long)(_zzq_arg5);           \
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_args[6] = (unsigned int long long)(_zzq_default);        \
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_ptr = _zzq_args;                                         \
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile("mr 4,%1\n\t"                                \
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "ld 3, 48(4)\n\t"                            \
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     __SPECIAL_INSTRUCTION_PREAMBLE               \
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = client_request ( %R4 ) */           \
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 1,1,1\n\t"                               \
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "mr %0,3"                                    \
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=b" (_zzq_result)                         \
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "b" (_zzq_ptr)                             \
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "r3", "r4", "cc", "memory");               \
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_rlval = _zzq_result;                                     \
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register unsigned long long int __addr;                       \
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = guest_NRADDR */                     \
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 2,2,2\n\t"                               \
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "mr %0,3"                                    \
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=b" (__addr)                              \
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :                                            \
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "r3", "cc", "memory"                       \
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_orig->nraddr = __addr;                                   \
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* %R3 = guest_NRADDR_GPR2 */                \
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 4,4,4\n\t"                               \
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "mr %0,3"                                    \
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "=b" (__addr)                              \
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :                                            \
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     : "r3", "cc", "memory"                       \
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    );                                            \
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _zzq_orig->r2 = __addr;                                       \
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     __SPECIAL_INSTRUCTION_PREAMBLE               \
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* branch-and-link-to-noredir *%R11 */       \
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "or 3,3,3\n\t"
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc64_aix5 */
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Insert assembly code for other platforms here... */
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NVALGRIND */
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* PLATFORM SPECIFICS for FUNCTION WRAPPING.  This is all very        */
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ugly.  It's the least-worst tradeoff I can think of.               */
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This section defines magic (a.k.a appalling-hack) macros for doing
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   guaranteed-no-redirection macros, so as to get from function
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   wrappers to the functions they are wrapping.  The whole point is to
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   construct standard call sequences, but to do the call itself with a
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   special no-redirect call pseudo-instruction that the JIT
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   understands and handles specially.  This section is long and
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   repetitious, and I can't see a way to make it shorter.
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   The naming scheme is as follows:
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   'W' stands for "word" and 'v' for "void".  Hence there are
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   different macros for calling arity 0, 1, 2, 3, 4, etc, functions,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   and for each, the possibility of returning a word-typed result, or
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   no result.
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Use these to write the name of your wrapper.  NOTE: duplicates
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. */
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname)                    \
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   _vgwZU_##soname##_##fnname
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname)                    \
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   _vgwZZ_##soname##_##fnname
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Use this macro from within a wrapper function to collect the
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   context (address and possibly other info) of the original function.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Once you have that you can then use it in one of the CALL_FN_
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   macros.  The type of the argument _lval is OrigFn. */
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_ORIG_FN(_lval)  VALGRIND_GET_NR_CONTEXT(_lval)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Derivatives of the main macros below, for calling functions
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   returning void. */
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_v_v(fnptr)                                        \
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do { volatile unsigned long _junk;                             \
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CALL_FN_W_v(_junk,fnptr); } while (0)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_v_W(fnptr, arg1)                                  \
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do { volatile unsigned long _junk;                             \
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_v_WW(fnptr, arg1,arg2)                            \
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do { volatile unsigned long _junk;                             \
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3)                      \
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do { volatile unsigned long _junk;                             \
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------- x86-linux ------------------------- */
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_x86_linux)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call.  No need to mention eax
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   as gcc can already see that, plus causes gcc to bomb. */
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx"
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   long) == 4. */
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig)                                   \
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[1];                          \
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1)                             \
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[2];                          \
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $4, %%esp\n"                                       \
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3];                          \
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $8, %%esp\n"                                       \
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[4];                          \
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $12, %%esp\n"                                      \
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[5];                          \
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 16(%%eax)\n\t"                                    \
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $16, %%esp\n"                                      \
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[6];                          \
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 20(%%eax)\n\t"                                    \
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 16(%%eax)\n\t"                                    \
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $20, %%esp\n"                                      \
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[7];                          \
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 24(%%eax)\n\t"                                    \
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 20(%%eax)\n\t"                                    \
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 16(%%eax)\n\t"                                    \
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $24, %%esp\n"                                      \
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7)                            \
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[8];                          \
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 28(%%eax)\n\t"                                    \
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 24(%%eax)\n\t"                                    \
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 20(%%eax)\n\t"                                    \
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 16(%%eax)\n\t"                                    \
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $28, %%esp\n"                                      \
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8)                       \
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[9];                          \
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 32(%%eax)\n\t"                                    \
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 28(%%eax)\n\t"                                    \
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 24(%%eax)\n\t"                                    \
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 20(%%eax)\n\t"                                    \
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 16(%%eax)\n\t"                                    \
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $32, %%esp\n"                                      \
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8,arg9)                  \
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[10];                         \
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)(arg9);                         \
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 36(%%eax)\n\t"                                    \
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 32(%%eax)\n\t"                                    \
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 28(%%eax)\n\t"                                    \
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 24(%%eax)\n\t"                                    \
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 20(%%eax)\n\t"                                    \
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 16(%%eax)\n\t"                                    \
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $36, %%esp\n"                                      \
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10)           \
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[11];                         \
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)(arg9);                         \
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[10] = (unsigned long)(arg10);                       \
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 40(%%eax)\n\t"                                    \
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 36(%%eax)\n\t"                                    \
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 32(%%eax)\n\t"                                    \
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 28(%%eax)\n\t"                                    \
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 24(%%eax)\n\t"                                    \
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 20(%%eax)\n\t"                                    \
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 16(%%eax)\n\t"                                    \
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $40, %%esp\n"                                      \
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg6,arg7,arg8,arg9,arg10,      \
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg11)                          \
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[12];                         \
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)(arg9);                         \
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[10] = (unsigned long)(arg10);                       \
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[11] = (unsigned long)(arg11);                       \
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 44(%%eax)\n\t"                                    \
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 40(%%eax)\n\t"                                    \
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 36(%%eax)\n\t"                                    \
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 32(%%eax)\n\t"                                    \
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 28(%%eax)\n\t"                                    \
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 24(%%eax)\n\t"                                    \
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 20(%%eax)\n\t"                                    \
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 16(%%eax)\n\t"                                    \
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $44, %%esp\n"                                      \
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg6,arg7,arg8,arg9,arg10,      \
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg11,arg12)                    \
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[13];                         \
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)(arg9);                         \
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[10] = (unsigned long)(arg10);                       \
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[11] = (unsigned long)(arg11);                       \
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[12] = (unsigned long)(arg12);                       \
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 48(%%eax)\n\t"                                    \
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 44(%%eax)\n\t"                                    \
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 40(%%eax)\n\t"                                    \
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 36(%%eax)\n\t"                                    \
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 32(%%eax)\n\t"                                    \
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 28(%%eax)\n\t"                                    \
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 24(%%eax)\n\t"                                    \
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 20(%%eax)\n\t"                                    \
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 16(%%eax)\n\t"                                    \
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 12(%%eax)\n\t"                                    \
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 8(%%eax)\n\t"                                     \
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushl 4(%%eax)\n\t"                                     \
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_EAX                                \
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addl $48, %%esp\n"                                      \
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_x86_linux */
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ amd64-linux ------------------------ */
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_amd64_linux)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi",       \
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "rdi", "r8", "r9", "r10", "r11"
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   long) == 8. */
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* NB 9 Sept 07.  There is a nasty kludge here in all these CALL_FN_
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   macros.  In order not to trash the stack redzone, we need to drop
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   %rsp by 128 before the hidden call, and restore afterwards.  The
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nastyness is that it is only by luck that the stack still appears
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   to be unwindable during the hidden call - since then the behaviour
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   of any routine using this macro does not match what the CFI data
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   says.  Sigh.
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Why is this important?  Imagine that a wrapper has a stack
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   allocated local, and passes to the hidden call, a pointer to it.
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Because gcc does not know about the hidden call, it may allocate
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   that local in the redzone.  Unfortunately the hidden call may then
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   trash it before it comes to use it.  So we must step clear of the
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   redzone, for the duration of the hidden call, to make it safe.
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Probably the same problem afflicts the other redzone-style ABIs too
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   (ppc64-linux, ppc32-aix5, ppc64-aix5); but for those, the stack is
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   self describing (none of this CFI nonsense) so at least messing
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   with the stack pointer doesn't give a danger of non-unwindable
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   stack. */
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig)                                   \
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[1];                          \
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1)                             \
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[2];                          \
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3];                          \
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[4];                          \
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[5];                          \
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 32(%%rax), %%rcx\n\t"                              \
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[6];                          \
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 40(%%rax), %%r8\n\t"                               \
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 32(%%rax), %%rcx\n\t"                              \
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[7];                          \
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 48(%%rax), %%r9\n\t"                               \
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 40(%%rax), %%r8\n\t"                               \
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 32(%%rax), %%rcx\n\t"                              \
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7)                            \
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[8];                          \
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 56(%%rax)\n\t"                                    \
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 48(%%rax), %%r9\n\t"                               \
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 40(%%rax), %%r8\n\t"                               \
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 32(%%rax), %%rcx\n\t"                              \
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $8, %%rsp\n"                                       \
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8)                       \
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[9];                          \
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 64(%%rax)\n\t"                                    \
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 56(%%rax)\n\t"                                    \
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 48(%%rax), %%r9\n\t"                               \
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 40(%%rax), %%r8\n\t"                               \
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 32(%%rax), %%rcx\n\t"                              \
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $16, %%rsp\n"                                      \
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8,arg9)                  \
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[10];                         \
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)(arg9);                         \
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 72(%%rax)\n\t"                                    \
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 64(%%rax)\n\t"                                    \
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 56(%%rax)\n\t"                                    \
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 48(%%rax), %%r9\n\t"                               \
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 40(%%rax), %%r8\n\t"                               \
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 32(%%rax), %%rcx\n\t"                              \
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $24, %%rsp\n"                                      \
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10)           \
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[11];                         \
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)(arg9);                         \
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[10] = (unsigned long)(arg10);                       \
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 80(%%rax)\n\t"                                    \
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 72(%%rax)\n\t"                                    \
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 64(%%rax)\n\t"                                    \
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 56(%%rax)\n\t"                                    \
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 48(%%rax), %%r9\n\t"                               \
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 40(%%rax), %%r8\n\t"                               \
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 32(%%rax), %%rcx\n\t"                              \
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $32, %%rsp\n"                                      \
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10,arg11)     \
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[12];                         \
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)(arg9);                         \
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[10] = (unsigned long)(arg10);                       \
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[11] = (unsigned long)(arg11);                       \
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 88(%%rax)\n\t"                                    \
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 80(%%rax)\n\t"                                    \
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 72(%%rax)\n\t"                                    \
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 64(%%rax)\n\t"                                    \
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 56(%%rax)\n\t"                                    \
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 48(%%rax), %%r9\n\t"                               \
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 40(%%rax), %%r8\n\t"                               \
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 32(%%rax), %%rcx\n\t"                              \
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $40, %%rsp\n"                                      \
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                arg7,arg8,arg9,arg10,arg11,arg12) \
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[13];                         \
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)(arg1);                         \
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)(arg2);                         \
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)(arg3);                         \
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)(arg4);                         \
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)(arg5);                         \
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)(arg6);                         \
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)(arg7);                         \
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)(arg8);                         \
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)(arg9);                         \
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[10] = (unsigned long)(arg10);                       \
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[11] = (unsigned long)(arg11);                       \
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[12] = (unsigned long)(arg12);                       \
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "subq $128,%%rsp\n\t"                                    \
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 96(%%rax)\n\t"                                    \
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 88(%%rax)\n\t"                                    \
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 80(%%rax)\n\t"                                    \
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 72(%%rax)\n\t"                                    \
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 64(%%rax)\n\t"                                    \
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "pushq 56(%%rax)\n\t"                                    \
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 48(%%rax), %%r9\n\t"                               \
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 40(%%rax), %%r8\n\t"                               \
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 32(%%rax), %%rcx\n\t"                              \
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 24(%%rax), %%rdx\n\t"                              \
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 16(%%rax), %%rsi\n\t"                              \
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq 8(%%rax), %%rdi\n\t"                               \
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_CALL_NOREDIR_RAX                                \
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $48, %%rsp\n"                                      \
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addq $128,%%rsp\n\t"                                    \
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=a" (_res)                                  \
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "a" (&_argvec[0])                            \
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_amd64_linux */
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc32-linux ------------------------ */
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc32_linux)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This is useful for finding out about the on-stack stuff:
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   extern int f9  ( int,int,int,int,int,int,int,int,int );
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   extern int f10 ( int,int,int,int,int,int,int,int,int,int );
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   extern int f11 ( int,int,int,int,int,int,int,int,int,int,int );
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int );
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int g9 ( void ) {
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return f9(11,22,33,44,55,66,77,88,99);
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int g10 ( void ) {
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return f10(11,22,33,44,55,66,77,88,99,110);
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int g11 ( void ) {
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return f11(11,22,33,44,55,66,77,88,99,110,121);
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int g12 ( void ) {
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return f12(11,22,33,44,55,66,77,88,99,110,121,132);
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS                                       \
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "lr", "ctr", "xer",                                            \
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "r11", "r12", "r13"
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on ppc32-linux,
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   sizeof(unsigned long) == 4. */
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig)                                   \
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[1];                          \
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1)                             \
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[2];                          \
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3];                          \
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[4];                          \
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[5];                          \
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)arg4;                           \
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[6];                          \
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)arg4;                           \
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)arg5;                           \
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 7,20(11)\n\t"                                       \
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[7];                          \
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)arg4;                           \
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)arg5;                           \
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)arg6;                           \
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 7,20(11)\n\t"                                       \
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 8,24(11)\n\t"                                       \
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7)                            \
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[8];                          \
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)arg4;                           \
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)arg5;                           \
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)arg6;                           \
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)arg7;                           \
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 7,20(11)\n\t"                                       \
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 8,24(11)\n\t"                                       \
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 9,28(11)\n\t"                                       \
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8)                       \
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[9];                          \
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)arg4;                           \
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)arg5;                           \
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)arg6;                           \
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)arg7;                           \
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)arg8;                           \
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 7,20(11)\n\t"                                       \
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 8,24(11)\n\t"                                       \
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 9,28(11)\n\t"                                       \
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8,arg9)                  \
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[10];                         \
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)arg4;                           \
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)arg5;                           \
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)arg6;                           \
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)arg7;                           \
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)arg8;                           \
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)arg9;                           \
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-16\n\t"                                       \
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,36(11)\n\t"                                       \
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,8(1)\n\t"                                         \
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 7,20(11)\n\t"                                       \
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 8,24(11)\n\t"                                       \
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 9,28(11)\n\t"                                       \
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,16\n\t"                                        \
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10)           \
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[11];                         \
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)arg4;                           \
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)arg5;                           \
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)arg6;                           \
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)arg7;                           \
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)arg8;                           \
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)arg9;                           \
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[10] = (unsigned long)arg10;                         \
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-16\n\t"                                       \
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,40(11)\n\t"                                       \
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,12(1)\n\t"                                        \
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,36(11)\n\t"                                       \
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,8(1)\n\t"                                         \
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 7,20(11)\n\t"                                       \
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 8,24(11)\n\t"                                       \
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 9,28(11)\n\t"                                       \
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,16\n\t"                                        \
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10,arg11)     \
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[12];                         \
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)arg4;                           \
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)arg5;                           \
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)arg6;                           \
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)arg7;                           \
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)arg8;                           \
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)arg9;                           \
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[10] = (unsigned long)arg10;                         \
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[11] = (unsigned long)arg11;                         \
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-32\n\t"                                       \
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg11 */                                              \
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,44(11)\n\t"                                       \
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,16(1)\n\t"                                        \
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,40(11)\n\t"                                       \
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,12(1)\n\t"                                        \
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,36(11)\n\t"                                       \
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,8(1)\n\t"                                         \
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 7,20(11)\n\t"                                       \
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 8,24(11)\n\t"                                       \
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 9,28(11)\n\t"                                       \
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,32\n\t"                                        \
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                arg7,arg8,arg9,arg10,arg11,arg12) \
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[13];                         \
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[0] = (unsigned long)_orig.nraddr;                   \
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)arg1;                           \
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)arg2;                           \
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[3] = (unsigned long)arg3;                           \
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[4] = (unsigned long)arg4;                           \
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[5] = (unsigned long)arg5;                           \
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[6] = (unsigned long)arg6;                           \
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[7] = (unsigned long)arg7;                           \
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[8] = (unsigned long)arg8;                           \
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[9] = (unsigned long)arg9;                           \
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[10] = (unsigned long)arg10;                         \
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[11] = (unsigned long)arg11;                         \
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[12] = (unsigned long)arg12;                         \
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-32\n\t"                                       \
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg12 */                                              \
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,48(11)\n\t"                                       \
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,20(1)\n\t"                                        \
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg11 */                                              \
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,44(11)\n\t"                                       \
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,16(1)\n\t"                                        \
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,40(11)\n\t"                                       \
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,12(1)\n\t"                                        \
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,36(11)\n\t"                                       \
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,8(1)\n\t"                                         \
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 4,8(11)\n\t"                                        \
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 5,12(11)\n\t"                                       \
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 7,20(11)\n\t"                                       \
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 8,24(11)\n\t"                                       \
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 9,28(11)\n\t"                                       \
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,32\n\t"                                        \
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3"                                                \
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[0])                            \
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc32_linux */
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc64-linux ------------------------ */
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc64_linux)
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS                                       \
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "lr", "ctr", "xer",                                            \
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "r11", "r12", "r13"
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   long) == 8. */
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig)                                   \
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+0];                        \
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)_orig.r2;                       \
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)_orig.nraddr;                   \
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)" /* restore tocptr */                      \
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1)                             \
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+1];                        \
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)" /* restore tocptr */                      \
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+2];                        \
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)" /* restore tocptr */                      \
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+3];                        \
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)" /* restore tocptr */                      \
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+4];                        \
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)" /* restore tocptr */                      \
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+5];                        \
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)" /* restore tocptr */                      \
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+6];                        \
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)" /* restore tocptr */                      \
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7)                            \
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+7];                        \
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)" /* restore tocptr */                      \
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8)                       \
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+8];                        \
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)" /* restore tocptr */                      \
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8,arg9)                  \
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+9];                        \
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-128\n\t"  /* expand stack frame */            \
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,72(11)\n\t"                                       \
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,112(1)\n\t"                                       \
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,128"     /* restore frame */                   \
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10)           \
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+10];                       \
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+10] = (unsigned long)arg10;                       \
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-128\n\t"  /* expand stack frame */            \
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,80(11)\n\t"                                       \
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,120(1)\n\t"                                       \
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,72(11)\n\t"                                       \
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,112(1)\n\t"                                       \
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,128"     /* restore frame */                   \
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10,arg11)     \
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+11];                       \
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+10] = (unsigned long)arg10;                       \
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+11] = (unsigned long)arg11;                       \
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-144\n\t"  /* expand stack frame */            \
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg11 */                                              \
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,88(11)\n\t"                                       \
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,128(1)\n\t"                                       \
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,80(11)\n\t"                                       \
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,120(1)\n\t"                                       \
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,72(11)\n\t"                                       \
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,112(1)\n\t"                                       \
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,144"     /* restore frame */                   \
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                arg7,arg8,arg9,arg10,arg11,arg12) \
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+12];                       \
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+10] = (unsigned long)arg10;                       \
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+11] = (unsigned long)arg11;                       \
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+12] = (unsigned long)arg12;                       \
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 2,-16(11)\n\t"  /* save tocptr */                   \
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-144\n\t"  /* expand stack frame */            \
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg12 */                                              \
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,96(11)\n\t"                                       \
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,136(1)\n\t"                                       \
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg11 */                                              \
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,88(11)\n\t"                                       \
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,128(1)\n\t"                                       \
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,80(11)\n\t"                                       \
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,120(1)\n\t"                                       \
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,72(11)\n\t"                                       \
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,112(1)\n\t"                                       \
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,144"     /* restore frame */                   \
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc64_linux */
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc32-aix5 ------------------------- */
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc32_aix5)
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS                                       \
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "lr", "ctr", "xer",                                            \
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "r11", "r12", "r13"
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Expand the stack frame, copying enough info that unwinding
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   still works.  Trashes r3. */
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr)                      \
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-" #_n_fr "\n\t"                               \
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3," #_n_fr "(1)\n\t"                               \
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  3,0(1)\n\t"
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_CONTRACT_FRAME_BY(_n_fr)                               \
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1," #_n_fr "\n\t"
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on ppc32-aix5, sizeof(unsigned
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   long) == 4. */
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig)                                   \
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+0];                        \
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)_orig.r2;                       \
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)_orig.nraddr;                   \
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1)                             \
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+1];                        \
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+2];                        \
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+3];                        \
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+4];                        \
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+5];                        \
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t" /* arg2->r4 */                       \
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+6];                        \
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7)                            \
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+7];                        \
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8)                       \
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+8];                        \
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8,arg9)                  \
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+9];                        \
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(64)                        \
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,36(11)\n\t"                                       \
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,56(1)\n\t"                                        \
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(64)                                 \
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10)           \
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+10];                       \
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+10] = (unsigned long)arg10;                       \
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(64)                        \
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,40(11)\n\t"                                       \
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,60(1)\n\t"                                        \
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,36(11)\n\t"                                       \
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,56(1)\n\t"                                        \
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(64)                                 \
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10,arg11)     \
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+11];                       \
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+10] = (unsigned long)arg10;                       \
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+11] = (unsigned long)arg11;                       \
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(72)                        \
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg11 */                                              \
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,44(11)\n\t"                                       \
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,64(1)\n\t"                                        \
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,40(11)\n\t"                                       \
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,60(1)\n\t"                                        \
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,36(11)\n\t"                                       \
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,56(1)\n\t"                                        \
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(72)                                 \
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                arg7,arg8,arg9,arg10,arg11,arg12) \
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+12];                       \
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+10] = (unsigned long)arg10;                       \
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+11] = (unsigned long)arg11;                       \
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+12] = (unsigned long)arg12;                       \
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(72)                        \
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg12 */                                              \
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,48(11)\n\t"                                       \
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,68(1)\n\t"                                        \
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg11 */                                              \
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,44(11)\n\t"                                       \
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,64(1)\n\t"                                        \
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,40(11)\n\t"                                       \
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,60(1)\n\t"                                        \
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 3,36(11)\n\t"                                       \
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "stw 3,56(1)\n\t"                                        \
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(72)                                 \
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc32_aix5 */
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc64-aix5 ------------------------- */
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc64_aix5)
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS                                       \
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "lr", "ctr", "xer",                                            \
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   "r11", "r12", "r13"
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Expand the stack frame, copying enough info that unwinding
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   still works.  Trashes r3. */
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr)                      \
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1,-" #_n_fr "\n\t"                               \
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3," #_n_fr "(1)\n\t"                               \
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  3,0(1)\n\t"
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_CONTRACT_FRAME_BY(_n_fr)                               \
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "addi 1,1," #_n_fr "\n\t"
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on ppc64-aix5, sizeof(unsigned
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   long) == 8. */
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig)                                   \
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+0];                        \
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1] = (unsigned long)_orig.r2;                       \
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2] = (unsigned long)_orig.nraddr;                   \
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1)                             \
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+1];                        \
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+2];                        \
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+3];                        \
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+4];                        \
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+5];                        \
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+6];                        \
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7)                            \
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+7];                        \
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8)                       \
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+8];                        \
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 arg7,arg8,arg9)                  \
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+9];                        \
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(128)                       \
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,72(11)\n\t"                                       \
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,112(1)\n\t"                                       \
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(128)                                \
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10)           \
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+10];                       \
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+10] = (unsigned long)arg10;                       \
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(128)                       \
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,80(11)\n\t"                                       \
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,120(1)\n\t"                                       \
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,72(11)\n\t"                                       \
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,112(1)\n\t"                                       \
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(128)                                \
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  arg7,arg8,arg9,arg10,arg11)     \
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+11];                       \
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+10] = (unsigned long)arg10;                       \
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+11] = (unsigned long)arg11;                       \
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(144)                       \
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg11 */                                              \
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,88(11)\n\t"                                       \
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,128(1)\n\t"                                       \
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,80(11)\n\t"                                       \
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,120(1)\n\t"                                       \
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,72(11)\n\t"                                       \
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,112(1)\n\t"                                       \
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(144)                                \
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                arg7,arg8,arg9,arg10,arg11,arg12) \
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do {                                                           \
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile OrigFn        _orig = (orig);                      \
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _argvec[3+12];                       \
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      volatile unsigned long _res;                                \
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* _argvec[0] holds current r2 across the call */           \
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[1]   = (unsigned long)_orig.r2;                     \
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+1] = (unsigned long)arg1;                         \
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+2] = (unsigned long)arg2;                         \
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+3] = (unsigned long)arg3;                         \
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+4] = (unsigned long)arg4;                         \
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+5] = (unsigned long)arg5;                         \
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+6] = (unsigned long)arg6;                         \
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+7] = (unsigned long)arg7;                         \
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+8] = (unsigned long)arg8;                         \
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+9] = (unsigned long)arg9;                         \
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+10] = (unsigned long)arg10;                       \
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+11] = (unsigned long)arg11;                       \
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _argvec[2+12] = (unsigned long)arg12;                       \
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __asm__ volatile(                                           \
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std  2,-16(11)\n\t" /* save tocptr */                   \
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_EXPAND_FRAME_BY_trashes_r3(144)                       \
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg12 */                                              \
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,96(11)\n\t"                                       \
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,136(1)\n\t"                                       \
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg11 */                                              \
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,88(11)\n\t"                                       \
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,128(1)\n\t"                                       \
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg10 */                                              \
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,80(11)\n\t"                                       \
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,120(1)\n\t"                                       \
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* arg9 */                                               \
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  3,72(11)\n\t"                                       \
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "std 3,112(1)\n\t"                                       \
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* args1-8 */                                            \
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr 11,%1\n\t"                                           \
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "mr %0,3\n\t"                                            \
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(144)                                \
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         VG_CONTRACT_FRAME_BY(512)                                \
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*out*/   "=r" (_res)                                  \
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*in*/    "r" (&_argvec[2])                            \
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );                                                          \
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lval = (__typeof__(lval)) _res;                             \
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (0)
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc64_aix5 */
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS.               */
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*                                                                    */
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Some request codes.  There are many more of these, but most are not
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   exposed to end-user view.  These are the public ones, all of the
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   form 0x1000 + small_number.
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Core ones are in the range 0x00000000--0x0000ffff.  The non-public
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ones start at 0x2000.
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These macros are used by tools -- they must be public, but don't
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   embed them into other programs. */
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_USERREQ_TOOL_BASE(a,b) \
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_IS_TOOL_USERREQ(a, b, v) \
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   This enum comprises an ABI exported by Valgrind to programs
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   which use client requests.  DO NOT CHANGE THE ORDER OF THESE
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ENTRIES, NOR DELETE ANY -- add new ones at the end. */
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   enum { VG_USERREQ__RUNNING_ON_VALGRIND  = 0x1001,
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* These allow any function to be called from the simulated
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             CPU but run on the real CPU.  Nb: the first arg passed to
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             the function is always the ThreadId of the running
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             thread!  So CLIENT_CALL0 actually requires a 1 arg
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             function, etc. */
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__CLIENT_CALL0 = 0x1101,
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__CLIENT_CALL1 = 0x1102,
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__CLIENT_CALL2 = 0x1103,
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__CLIENT_CALL3 = 0x1104,
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Can be useful in regression testing suites -- eg. can
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             send Valgrind's output to /dev/null and still count
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             errors. */
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__COUNT_ERRORS = 0x1201,
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* These are useful and can be interpreted by any tool that
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             tracks malloc() et al, by using vg_replace_malloc.c. */
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__FREELIKE_BLOCK   = 0x1302,
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Memory pool support. */
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__CREATE_MEMPOOL   = 0x1303,
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__DESTROY_MEMPOOL  = 0x1304,
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__MEMPOOL_ALLOC    = 0x1305,
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__MEMPOOL_FREE     = 0x1306,
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__MEMPOOL_TRIM     = 0x1307,
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__MOVE_MEMPOOL     = 0x1308,
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__MEMPOOL_CHANGE   = 0x1309,
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__MEMPOOL_EXISTS   = 0x130a,
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Allow printfs to valgrind log. */
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__PRINTF           = 0x1401,
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Stack support. */
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__STACK_REGISTER   = 0x1501,
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__STACK_DEREGISTER = 0x1502,
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VG_USERREQ__STACK_CHANGE     = 0x1503
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } Vg_ClientRequest;
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(__GNUC__)
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define __extension__ /* */
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Returns the number of Valgrinds this code is running under.  That
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   is, 0 if running natively, 1 if running under Valgrind, 2 if
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   running under Valgrind which is running under another Valgrind,
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   etc. */
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RUNNING_ON_VALGRIND  __extension__                        \
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ({unsigned int _qzz_res;                                       \
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0 /* if not */,          \
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__RUNNING_ON_VALGRIND,   \
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               0, 0, 0, 0, 0);                    \
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _qzz_res;                                                     \
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   })
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   _qzz_len - 1].  Useful if you are debugging a JITter or some such,
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   since it provides a way to make sure valgrind will retranslate the
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   invalidated area.  Returns no value. */
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len)         \
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__DISCARD_TRANSLATIONS,  \
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _qzz_addr, _qzz_len, 0, 0, 0);     \
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These requests are for getting Valgrind itself to print something.
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Possibly with a backtrace.  This is a really ugly hack. */
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NVALGRIND)
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define VALGRIND_PRINTF(...)
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define VALGRIND_PRINTF_BACKTRACE(...)
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* NVALGRIND */
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Modern GCC will optimize the static routine out if unused,
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   and unused attribute will shut down warnings about it.  */
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int VALGRIND_PRINTF(const char *format, ...)
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __attribute__((format(__printf__, 1, 2), __unused__));
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VALGRIND_PRINTF(const char *format, ...)
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned long _qzz_res;
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   va_list vargs;
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   va_start(vargs, format);
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF,
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              (unsigned long)format, (unsigned long)vargs,
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              0, 0, 0);
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   va_end(vargs);
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (int)_qzz_res;
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __attribute__((format(__printf__, 1, 2), __unused__));
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned long _qzz_res;
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   va_list vargs;
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   va_start(vargs, format);
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF_BACKTRACE,
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              (unsigned long)format, (unsigned long)vargs,
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              0, 0, 0);
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   va_end(vargs);
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (int)_qzz_res;
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NVALGRIND */
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These requests allow control to move from the simulated CPU to the
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   real CPU, calling an arbitary function.
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Note that the current ThreadId is inserted as the first argument.
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   So this call:
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     VALGRIND_NON_SIMD_CALL2(f, arg1, arg2)
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   requires f to have this signature:
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     Word f(Word tid, Word arg1, Word arg2)
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   where "Word" is a word-sized type.
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Note that these client requests are not entirely reliable.  For example,
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if you call a function with them that subsequently calls printf(),
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   there's a high chance Valgrind will crash.  Generally, your prospects of
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   these working are made higher if the called function does not refer to
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   any global variables, and does not refer to any libc or other functions
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   (printf et al).  Any kind of entanglement with libc or dynamic linking is
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   likely to have a bad outcome, for tricky reasons which we've grappled
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   with a lot in the past.
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_NON_SIMD_CALL0(_qyy_fn)                          \
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __extension__                                                  \
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ({unsigned long _qyy_res;                                      \
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__CLIENT_CALL0,          \
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _qyy_fn,                           \
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               0, 0, 0, 0);                       \
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _qyy_res;                                                     \
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   })
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1)               \
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __extension__                                                  \
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ({unsigned long _qyy_res;                                      \
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__CLIENT_CALL1,          \
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _qyy_fn,                           \
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _qyy_arg1, 0, 0, 0);               \
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _qyy_res;                                                     \
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   })
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2)    \
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __extension__                                                  \
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ({unsigned long _qyy_res;                                      \
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__CLIENT_CALL2,          \
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _qyy_fn,                           \
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _qyy_arg1, _qyy_arg2, 0, 0);       \
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _qyy_res;                                                     \
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   })
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __extension__                                                  \
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ({unsigned long _qyy_res;                                      \
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__CLIENT_CALL3,          \
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _qyy_fn,                           \
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _qyy_arg1, _qyy_arg2,              \
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _qyy_arg3, 0);                     \
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _qyy_res;                                                     \
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   })
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Counts the number of errors that have been recorded by a tool.  Nb:
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   the tool must record the errors with VG_(maybe_record_error)() or
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VG_(unique_error)() for them to be counted. */
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_COUNT_ERRORS                                     \
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __extension__                                                  \
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ({unsigned int _qyy_res;                                       \
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__COUNT_ERRORS,          \
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               0, 0, 0, 0, 0);                    \
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _qyy_res;                                                     \
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   })
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Mark a block of memory as having been allocated by a malloc()-like
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   function.  `addr' is the start of the usable block (ie. after any
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   redzone) `rzB' is redzone size if the allocator can apply redzones;
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   use '0' if not.  Adding redzones makes it more likely Valgrind will spot
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   block overruns.  `is_zeroed' indicates if the memory is zeroed, as it is
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for calloc().  Put it immediately after the point where a block is
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   allocated.
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   If you're using Memcheck: If you're allocating memory via superblocks,
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   and then handing out small chunks of each superblock, if you don't have
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   redzones on your small blocks, it's worth marking the superblock with
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VALGRIND_MAKE_MEM_NOACCESS when it's created, so that block overruns are
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   detected.  But if you can put redzones on, it's probably better to not do
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   this, so that messages for small overruns are described in terms of the
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   small block rather than the superblock (but if you have a big overrun
37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   that skips over a redzone, you could miss an error this way).  See
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memcheck/tests/custom_alloc.c for an example.
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   WARNING: if your allocator uses malloc() or 'new' to allocate
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   superblocks, rather than mmap() or brk(), this will not work properly --
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   you'll likely get assertion failures during leak detection.  This is
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   because Valgrind doesn't like seeing overlapping heap blocks.  Sorry.
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Nb: block must be freed via a free()-like function specified
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   with VALGRIND_FREELIKE_BLOCK or mismatch errors will occur. */
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)    \
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__MALLOCLIKE_BLOCK,      \
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               addr, sizeB, rzB, is_zeroed, 0);   \
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Mark a block of memory as having been freed by a free()-like function.
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   `rzB' is redzone size;  it must match that given to
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VALGRIND_MALLOCLIKE_BLOCK.  Memory not freed will be detected by the leak
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   checker.  Put it immediately after the point where the block is freed. */
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_FREELIKE_BLOCK(addr, rzB)                        \
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__FREELIKE_BLOCK,        \
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               addr, rzB, 0, 0, 0);               \
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Create a memory pool. */
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed)             \
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__CREATE_MEMPOOL,        \
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               pool, rzB, is_zeroed, 0, 0);       \
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Destroy a memory pool. */
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DESTROY_MEMPOOL(pool)                            \
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__DESTROY_MEMPOOL,       \
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               pool, 0, 0, 0, 0);                 \
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Associate a piece of memory with a memory pool. */
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size)                  \
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__MEMPOOL_ALLOC,         \
38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               pool, addr, size, 0, 0);           \
38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Disassociate a piece of memory from a memory pool. */
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_FREE(pool, addr)                         \
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__MEMPOOL_FREE,          \
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               pool, addr, 0, 0, 0);              \
38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Disassociate any pieces outside a particular range. */
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_TRIM(pool, addr, size)                   \
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__MEMPOOL_TRIM,          \
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               pool, addr, size, 0, 0);           \
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Resize and/or move a piece associated with a memory pool. */
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MOVE_MEMPOOL(poolA, poolB)                       \
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__MOVE_MEMPOOL,          \
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               poolA, poolB, 0, 0, 0);            \
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Resize and/or move a piece associated with a memory pool. */
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size)         \
38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__MEMPOOL_CHANGE,        \
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               pool, addrA, addrB, size, 0);      \
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Return 1 if a mempool exists, else 0. */
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_EXISTS(pool)                             \
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ({unsigned int _qzz_res;                                       \
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__MEMPOOL_EXISTS,        \
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               pool, 0, 0, 0, 0);                 \
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _qzz_res;                                                     \
38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   })
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Mark a piece of memory as being a stack. Returns a stack id. */
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_STACK_REGISTER(start, end)                       \
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ({unsigned int _qzz_res;                                       \
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__STACK_REGISTER,        \
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               start, end, 0, 0, 0);              \
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _qzz_res;                                                     \
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   })
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Unmark the piece of memory associated with a stack id as being a
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   stack. */
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_STACK_DEREGISTER(id)                             \
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__STACK_DEREGISTER,      \
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               id, 0, 0, 0, 0);                   \
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Change the start and end address of the stack id. */
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_STACK_CHANGE(id, start, end)                     \
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {unsigned int _qzz_res;                                        \
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               VG_USERREQ__STACK_CHANGE,          \
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               id, start, end, 0, 0);             \
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_x86_linux
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_amd64_linux
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc32_linux
39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc64_linux
39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc32_aix5
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc64_aix5
39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif   /* __VALGRIND_H */
3925