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