194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#ifdef ANDROID
294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  #include "include/valgrind.h"
394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else
494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* -*- c -*-
594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ----------------------------------------------------------------
694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Notice that the following BSD-style license applies to this one
894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   file (valgrind.h) only.  The rest of Valgrind is licensed under the
994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   terms of the GNU General Public License, version 2, unless
1094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   otherwise indicated.  See the COPYING file in the source
1194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   distribution for details.
1294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
1394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ----------------------------------------------------------------
1494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
1594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   This file is part of Valgrind, a dynamic binary instrumentation
1694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   framework.
1794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
1894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Copyright (C) 2000-2010 Julian Seward.  All rights reserved.
1994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
2094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Redistribution and use in source and binary forms, with or without
2194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   modification, are permitted provided that the following conditions
2294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   are met:
2394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
2494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   1. Redistributions of source code must retain the above copyright
2594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      notice, this list of conditions and the following disclaimer.
2694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
2794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   2. The origin of this software must not be misrepresented; you must
2894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      not claim that you wrote the original software.  If you use this
2994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      software in a product, an acknowledgment in the product
3094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      documentation would be appreciated but is not required.
3194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
3294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   3. Altered source versions must be plainly marked as such, and must
3394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      not be misrepresented as being the original software.
3494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
3594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   4. The name of the author may not be used to endorse or promote
3694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      products derived from this software without specific prior written
3794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      permission.
3894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
3994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
4094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
4194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
4394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
4594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
4694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
4794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
4994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
5094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
5194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ----------------------------------------------------------------
5294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
5394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Notice that the above BSD-style license applies to this one file
5494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   (valgrind.h) only.  The entire rest of Valgrind is licensed under
5594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   the terms of the GNU General Public License, version 2.  See the
5694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   COPYING file in the source distribution for details.
5794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
5894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ----------------------------------------------------------------
5994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
6094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
6194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
6294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* This file is for inclusion into client (your!) code.
6394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
6494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   You can use these macros to manipulate and query Valgrind's
6594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   execution inside your own programs.
6694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
6794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   The resulting executables will still run without Valgrind, just a
6894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   little bit more slowly than they otherwise would, but otherwise
6994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   unchanged.  When not running on valgrind, each client request
7094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   consumes very few (eg. 7) instructions, so the resulting performance
7194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   loss is negligible unless you plan to execute client requests
7294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   millions of times per second.  Nevertheless, if that is still a
7394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   problem, you can compile with the NVALGRIND symbol defined (gcc
7494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   -DNVALGRIND) so that client requests are not even compiled in.  */
7594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
7694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#ifndef __VALGRIND_H
7794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __VALGRIND_H
7894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
7994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
8094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */
8194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* VERSION NUMBER OF VALGRIND                                         */
8294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */
8394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
8494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Specify Valgrind's version number, so that user code can
8594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   conditionally compile based on our version number.  Note that these
8694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   were introduced at version 3.6 and so do not exist in version 3.5
8794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   or earlier.  The recommended way to use them to check for "version
8894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   X.Y or later" is (eg)
8994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
9094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__)   \
9194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    && (__VALGRIND_MAJOR__ > 3                                   \
9294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6))
9394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
9494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __VALGRIND_MAJOR__    3
9594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __VALGRIND_MINOR__    6
9694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
9794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
9894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include <stdarg.h>
9994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
10094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Nb: this file might be included in a file compiled with -ansi.  So
10194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   we can't use C++ style "//" comments nor the "asm" keyword (instead
10294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   use "__asm__"). */
10394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
10494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Derive some tags indicating what the target platform is.  Note
10594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   that in this file we're using the compiler's CPP symbols for
10694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   identifying architectures, which are different to the ones we use
10794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   within the rest of Valgrind.  Note, __powerpc__ is active for both
10894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   32 and 64-bit PPC, whereas __powerpc64__ is only active for the
10994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   latter (on Linux, that is).
11094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
11194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Misc note: how to find out what's predefined in gcc by default:
11294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   gcc -Wp,-dM somefile.c
11394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
11494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc64_aix5
11594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc32_aix5
11694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_x86_darwin
11794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_amd64_darwin
11894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_x86_win32
11994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_x86_linux
12094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_amd64_linux
12194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc32_linux
12294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc64_linux
12394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_arm_linux
12494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
12594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_AIX) && defined(__64BIT__)
12694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_ppc64_aix5 1
12794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(_AIX) && !defined(__64BIT__)
12894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_ppc32_aix5 1
12994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__APPLE__) && defined(__i386__)
13094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_x86_darwin 1
13194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__APPLE__) && defined(__x86_64__)
13294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_amd64_darwin 1
13394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__MINGW32__) || defined(__CYGWIN32__) || defined(_WIN32) && defined(_M_IX86)
13494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_x86_win32 1
13594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__i386__)
13694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_x86_linux 1
13794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__x86_64__)
13894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_amd64_linux 1
13994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
14094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_ppc32_linux 1
14194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__)
14294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_ppc64_linux 1
14394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__arm__)
14494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define PLAT_arm_linux 1
14594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else
14694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* If we're not compiling for our target platform, don't generate
14794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   any inline asms.  */
14894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  if !defined(NVALGRIND)
14994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#    define NVALGRIND 1
15094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  endif
15194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
15294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
15394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
15494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */
15594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS.  There is nothing */
15694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* in here of use to end-users -- skip to the next section.           */
15794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */
15894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
15994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(NVALGRIND)
16094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
16194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Define NVALGRIND to completely remove the Valgrind magic sequence
16294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   from the compiled code (analogous to NDEBUG's effects on
16394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   assert()) */
16494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST(                               \
16594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_rlval, _zzq_default, _zzq_request,                   \
16694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
16794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {                                                              \
16894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      (_zzq_rlval) = (_zzq_default);                              \
16994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
17094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
17194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else  /* ! NVALGRIND */
17294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
17394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* The following defines the magic code sequences which the JITter
17494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   spots and handles magically.  Don't look too closely at them as
17594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   they will rot your brain.
17694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
17794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   The assembly code sequences for all architectures is in this one
17894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   file.  This is because this file must be stand-alone, and we don't
17994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   want to have multiple files.
18094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
18194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default
18294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   value gets put in the return slot, so that everything works when
18394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   this is executed not under Valgrind.  Args are passed in a memory
18494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   block, and so there's no intrinsic limit to the number that could
18594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   be passed, but it's currently five.
18694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
18794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   The macro args are:
18894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _zzq_rlval    result lvalue
18994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _zzq_default  default value (result returned when running on real CPU)
19094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _zzq_request  request code
19194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _zzq_arg1..5  request params
19294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
19394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   The other two macros are used to support function wrapping, and are
19494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   a lot simpler.  VALGRIND_GET_NR_CONTEXT returns the value of the
19594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   guest's NRADDR pseudo-register and whatever other information is
19694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   needed to safely run the call original from the wrapper: on
19794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ppc64-linux, the R2 value at the divert point is also needed.  This
19894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   information is abstracted into a user-visible type, OrigFn.
19994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
20094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VALGRIND_CALL_NOREDIR_* behaves the same as the following on the
20194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   guest, but guarantees that the branch instruction will not be
20294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64:
20394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   branch-and-link-to-r11.  VALGRIND_CALL_NOREDIR is just text, not a
20494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   complete inline asm, since it needs to be combined with more magic
20594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   inline asm stuff to be useful.
20694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
20794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
20894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- x86-{linux,darwin} ---------------- */
20994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
21094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)  \
21194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    ||  (defined(PLAT_x86_win32) && defined(__GNUC__))
21294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
21394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef
21494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   struct {
21594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned int nraddr; /* where's the code? */
21694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
21794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   OrigFn;
21894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
21994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
22094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "roll $3,  %%edi ; roll $13, %%edi\n\t"      \
22194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "roll $29, %%edi ; roll $19, %%edi\n\t"
22294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
22394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST(                               \
22494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_rlval, _zzq_default, _zzq_request,                   \
22594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
22694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile unsigned int _zzq_args[6];                           \
22794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    volatile unsigned int _zzq_result;                            \
22894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
22994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
23094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
23194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
23294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
23394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
23494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
23594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %EDX = client_request ( %EAX ) */         \
23694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "xchgl %%ebx,%%ebx"                          \
23794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=d" (_zzq_result)                         \
23894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
23994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory"                             \
24094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
24194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_rlval = _zzq_result;                                     \
24294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
24394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
24494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
24594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
24694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    volatile unsigned int __addr;                                 \
24794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
24894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %EAX = guest_NRADDR */                    \
24994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "xchgl %%ecx,%%ecx"                          \
25094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=a" (__addr)                              \
25194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
25294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory"                             \
25394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
25494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->nraddr = __addr;                                   \
25594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
25694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
25794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_CALL_NOREDIR_EAX                                 \
25894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
25994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* call-noredir *%EAX */                     \
26094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "xchgl %%edx,%%edx\n\t"
26194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */
26294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
26394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- x86-Win32 ------------------------- */
26494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
26594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_x86_win32) && !defined(__GNUC__)
26694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
26794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef
26894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   struct {
26994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned int nraddr; /* where's the code? */
27094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
27194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   OrigFn;
27294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
27394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER)
27494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
27594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
27694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __asm rol edi, 3  __asm rol edi, 13          \
27794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __asm rol edi, 29 __asm rol edi, 19
27894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
27994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST(                               \
28094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_rlval, _zzq_default, _zzq_request,                   \
28194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
28294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile uintptr_t _zzq_args[6];                              \
28394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    volatile unsigned int _zzq_result;                            \
28494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[0] = (uintptr_t)(_zzq_request);                     \
28594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[1] = (uintptr_t)(_zzq_arg1);                        \
28694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[2] = (uintptr_t)(_zzq_arg2);                        \
28794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[3] = (uintptr_t)(_zzq_arg3);                        \
28894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[4] = (uintptr_t)(_zzq_arg4);                        \
28994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[5] = (uintptr_t)(_zzq_arg5);                        \
29094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default  \
29194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez            __SPECIAL_INSTRUCTION_PREAMBLE                        \
29294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez            /* %EDX = client_request ( %EAX ) */                  \
29394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez            __asm xchg ebx,ebx                                    \
29494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez            __asm mov _zzq_result, edx                            \
29594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    }                                                             \
29694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_rlval = _zzq_result;                                     \
29794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
29894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
29994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
30094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
30194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    volatile unsigned int __addr;                                 \
30294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm { __SPECIAL_INSTRUCTION_PREAMBLE                        \
30394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez            /* %EAX = guest_NRADDR */                             \
30494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez            __asm xchg ecx,ecx                                    \
30594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez            __asm mov __addr, eax                                 \
30694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    }                                                             \
30794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->nraddr = __addr;                                   \
30894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
30994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
31094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_CALL_NOREDIR_EAX ERROR
31194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
31294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else
31394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#error Unsupported compiler.
31494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
31594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
31694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_x86_win32 */
31794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
31894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ amd64-{linux,darwin} --------------- */
31994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
32094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin)
32194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
32294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef
32394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   struct {
32494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned long long int nraddr; /* where's the code? */
32594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
32694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   OrigFn;
32794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
32894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
32994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rolq $3,  %%rdi ; rolq $13, %%rdi\n\t"      \
33094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
33194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
33294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST(                               \
33394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_rlval, _zzq_default, _zzq_request,                   \
33494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
33594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile unsigned long long int _zzq_args[6];                 \
33694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    volatile unsigned long long int _zzq_result;                  \
33794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[0] = (unsigned long long int)(_zzq_request);        \
33894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[1] = (unsigned long long int)(_zzq_arg1);           \
33994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[2] = (unsigned long long int)(_zzq_arg2);           \
34094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[3] = (unsigned long long int)(_zzq_arg3);           \
34194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[4] = (unsigned long long int)(_zzq_arg4);           \
34294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[5] = (unsigned long long int)(_zzq_arg5);           \
34394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
34494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %RDX = client_request ( %RAX ) */         \
34594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "xchgq %%rbx,%%rbx"                          \
34694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=d" (_zzq_result)                         \
34794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
34894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory"                             \
34994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
35094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_rlval = _zzq_result;                                     \
35194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
35294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
35394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
35494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
35594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    volatile unsigned long long int __addr;                       \
35694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
35794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %RAX = guest_NRADDR */                    \
35894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "xchgq %%rcx,%%rcx"                          \
35994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=a" (__addr)                              \
36094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
36194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory"                             \
36294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
36394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->nraddr = __addr;                                   \
36494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
36594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
36694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_CALL_NOREDIR_RAX                                 \
36794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
36894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* call-noredir *%RAX */                     \
36994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "xchgq %%rdx,%%rdx\n\t"
37094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
37194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
37294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc32-linux ------------------------ */
37394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
37494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc32_linux)
37594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
37694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef
37794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   struct {
37894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned int nraddr; /* where's the code? */
37994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
38094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   OrigFn;
38194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
38294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
38394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rlwinm 0,0,3,0,0  ; rlwinm 0,0,13,0,0\n\t"  \
38494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
38594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
38694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST(                               \
38794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_rlval, _zzq_default, _zzq_request,                   \
38894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
38994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                                                  \
39094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  {          unsigned int  _zzq_args[6];                          \
39194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             unsigned int  _zzq_result;                           \
39294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             unsigned int* _zzq_ptr;                              \
39394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
39494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
39594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
39694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
39794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
39894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
39994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_ptr = _zzq_args;                                         \
40094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
40194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mr 4,%2\n\t" /*ptr*/                        \
40294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
40394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = client_request ( %R4 ) */           \
40494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 1,1,1\n\t"                               \
40594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mr %0,3"     /*result*/                     \
40694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=b" (_zzq_result)                         \
40794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "b" (_zzq_default), "b" (_zzq_ptr)         \
40894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory", "r3", "r4");               \
40994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_rlval = _zzq_result;                                     \
41094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
41194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
41294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
41394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
41494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    unsigned int __addr;                                          \
41594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
41694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = guest_NRADDR */                     \
41794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 2,2,2\n\t"                               \
41894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mr %0,3"                                    \
41994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=b" (__addr)                              \
42094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
42194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory", "r3"                       \
42294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
42394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->nraddr = __addr;                                   \
42494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
42594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
42694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
42794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
42894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* branch-and-link-to-noredir *%R11 */       \
42994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 3,3,3\n\t"
43094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc32_linux */
43194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
43294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc64-linux ------------------------ */
43394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
43494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc64_linux)
43594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
43694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef
43794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   struct {
43894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned long long int nraddr; /* where's the code? */
43994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned long long int r2;  /* what tocptr do we need? */
44094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
44194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   OrigFn;
44294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
44394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
44494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
44594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
44694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
44794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST(                               \
44894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_rlval, _zzq_default, _zzq_request,                   \
44994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
45094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                                                  \
45194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  {          unsigned long long int  _zzq_args[6];                \
45294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    register unsigned long long int  _zzq_result __asm__("r3");   \
45394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    register unsigned long long int* _zzq_ptr __asm__("r4");      \
45494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[0] = (unsigned long long int)(_zzq_request);        \
45594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[1] = (unsigned long long int)(_zzq_arg1);           \
45694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[2] = (unsigned long long int)(_zzq_arg2);           \
45794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[3] = (unsigned long long int)(_zzq_arg3);           \
45894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[4] = (unsigned long long int)(_zzq_arg4);           \
45994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[5] = (unsigned long long int)(_zzq_arg5);           \
46094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_ptr = _zzq_args;                                         \
46194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
46294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = client_request ( %R4 ) */           \
46394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 1,1,1"                                   \
46494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=r" (_zzq_result)                         \
46594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "0" (_zzq_default), "r" (_zzq_ptr)         \
46694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory");                           \
46794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_rlval = _zzq_result;                                     \
46894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
46994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
47094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
47194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
47294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    register unsigned long long int __addr __asm__("r3");         \
47394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
47494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = guest_NRADDR */                     \
47594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 2,2,2"                                   \
47694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=r" (__addr)                              \
47794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
47894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory"                             \
47994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
48094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->nraddr = __addr;                                   \
48194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
48294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = guest_NRADDR_GPR2 */                \
48394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 4,4,4"                                   \
48494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=r" (__addr)                              \
48594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
48694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory"                             \
48794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
48894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->r2 = __addr;                                       \
48994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
49094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
49194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
49294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
49394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* branch-and-link-to-noredir *%R11 */       \
49494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 3,3,3\n\t"
49594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
49694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc64_linux */
49794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
49894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- arm-linux ------------------------- */
49994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
50094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_arm_linux)
50194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
50294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef
50394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   struct {
50494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned int nraddr; /* where's the code? */
50594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
50694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   OrigFn;
50794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
50894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
50994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez            "mov r12, r12, ror #3  ; mov r12, r12, ror #13 \n\t"  \
51094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez            "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
51194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
51294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST(                               \
51394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_rlval, _zzq_default, _zzq_request,                   \
51494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
51594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                                                  \
51694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile unsigned int  _zzq_args[6];                          \
51794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    volatile unsigned int  _zzq_result;                           \
51894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
51994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
52094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
52194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
52294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
52394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
52494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile("mov r3, %1\n\t" /*default*/                 \
52594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mov r4, %2\n\t" /*ptr*/                     \
52694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
52794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* R3 = client_request ( R4 ) */             \
52894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "orr r10, r10, r10\n\t"                      \
52994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mov %0, r3"     /*result*/                  \
53094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=r" (_zzq_result)                         \
53194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "r" (_zzq_default), "r" (&_zzq_args[0])    \
53294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc","memory", "r3", "r4");                \
53394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_rlval = _zzq_result;                                     \
53494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
53594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
53694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
53794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
53894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    unsigned int __addr;                                          \
53994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
54094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* R3 = guest_NRADDR */                      \
54194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "orr r11, r11, r11\n\t"                      \
54294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mov %0, r3"                                 \
54394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=r" (__addr)                              \
54494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
54594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "cc", "memory", "r3"                       \
54694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
54794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->nraddr = __addr;                                   \
54894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
54994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
55094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                    \
55194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
55294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* branch-and-link-to-noredir *%R4 */        \
55394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "orr r12, r12, r12\n\t"
55494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
55594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_arm_linux */
55694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
55794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc32-aix5 ------------------------- */
55894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
55994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc32_aix5)
56094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
56194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef
56294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   struct {
56394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned int nraddr; /* where's the code? */
56494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned int r2;  /* what tocptr do we need? */
56594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
56694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   OrigFn;
56794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
56894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
56994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rlwinm 0,0,3,0,0  ; rlwinm 0,0,13,0,0\n\t"  \
57094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
57194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
57294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST(                               \
57394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_rlval, _zzq_default, _zzq_request,                   \
57494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
57594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                                                  \
57694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  {          unsigned int  _zzq_args[7];                          \
57794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    register unsigned int  _zzq_result;                           \
57894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    register unsigned int* _zzq_ptr;                              \
57994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
58094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
58194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
58294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
58394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
58494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
58594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[6] = (unsigned int)(_zzq_default);                  \
58694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_ptr = _zzq_args;                                         \
58794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile("mr 4,%1\n\t"                                \
58894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "lwz 3, 24(4)\n\t"                           \
58994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
59094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = client_request ( %R4 ) */           \
59194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 1,1,1\n\t"                               \
59294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mr %0,3"                                    \
59394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=b" (_zzq_result)                         \
59494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "b" (_zzq_ptr)                             \
59594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "r3", "r4", "cc", "memory");               \
59694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_rlval = _zzq_result;                                     \
59794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
59894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
59994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
60094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
60194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    register unsigned int __addr;                                 \
60294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
60394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = guest_NRADDR */                     \
60494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 2,2,2\n\t"                               \
60594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mr %0,3"                                    \
60694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=b" (__addr)                              \
60794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
60894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "r3", "cc", "memory"                       \
60994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
61094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->nraddr = __addr;                                   \
61194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
61294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = guest_NRADDR_GPR2 */                \
61394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 4,4,4\n\t"                               \
61494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mr %0,3"                                    \
61594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=b" (__addr)                              \
61694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
61794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "r3", "cc", "memory"                       \
61894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
61994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->r2 = __addr;                                       \
62094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
62194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
62294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
62394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
62494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* branch-and-link-to-noredir *%R11 */       \
62594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 3,3,3\n\t"
62694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
62794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc32_aix5 */
62894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
62994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc64-aix5 ------------------------- */
63094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
63194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc64_aix5)
63294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
63394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef
63494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   struct {
63594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned long long int nraddr; /* where's the code? */
63694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      unsigned long long int r2;  /* what tocptr do we need? */
63794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
63894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   OrigFn;
63994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
64094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
64194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
64294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
64394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
64494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST(                               \
64594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_rlval, _zzq_default, _zzq_request,                   \
64694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
64794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                                                  \
64894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  {          unsigned long long int  _zzq_args[7];                \
64994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    register unsigned long long int  _zzq_result;                 \
65094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    register unsigned long long int* _zzq_ptr;                    \
65194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[0] = (unsigned int long long)(_zzq_request);        \
65294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[1] = (unsigned int long long)(_zzq_arg1);           \
65394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[2] = (unsigned int long long)(_zzq_arg2);           \
65494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[3] = (unsigned int long long)(_zzq_arg3);           \
65594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[4] = (unsigned int long long)(_zzq_arg4);           \
65694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[5] = (unsigned int long long)(_zzq_arg5);           \
65794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_args[6] = (unsigned int long long)(_zzq_default);        \
65894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_ptr = _zzq_args;                                         \
65994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile("mr 4,%1\n\t"                                \
66094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "ld 3, 48(4)\n\t"                            \
66194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
66294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = client_request ( %R4 ) */           \
66394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 1,1,1\n\t"                               \
66494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mr %0,3"                                    \
66594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=b" (_zzq_result)                         \
66694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "b" (_zzq_ptr)                             \
66794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "r3", "r4", "cc", "memory");               \
66894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_rlval = _zzq_result;                                     \
66994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
67094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
67194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
67294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
67394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    register unsigned long long int __addr;                       \
67494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
67594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = guest_NRADDR */                     \
67694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 2,2,2\n\t"                               \
67794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mr %0,3"                                    \
67894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=b" (__addr)                              \
67994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
68094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "r3", "cc", "memory"                       \
68194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
68294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->nraddr = __addr;                                   \
68394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
68494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* %R3 = guest_NRADDR_GPR2 */                \
68594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 4,4,4\n\t"                               \
68694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "mr %0,3"                                    \
68794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "=b" (__addr)                              \
68894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     :                                            \
68994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     : "r3", "cc", "memory"                       \
69094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                    );                                            \
69194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_orig->r2 = __addr;                                       \
69294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  }
69394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
69494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
69594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     __SPECIAL_INSTRUCTION_PREAMBLE               \
69694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     /* branch-and-link-to-noredir *%R11 */       \
69794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                     "or 3,3,3\n\t"
69894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
69994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc64_aix5 */
70094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
70194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Insert assembly code for other platforms here... */
70294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
70394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* NVALGRIND */
70494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
70594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
70694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */
70794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* PLATFORM SPECIFICS for FUNCTION WRAPPING.  This is all very        */
70894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ugly.  It's the least-worst tradeoff I can think of.               */
70994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */
71094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
71194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* This section defines magic (a.k.a appalling-hack) macros for doing
71294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   guaranteed-no-redirection macros, so as to get from function
71394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   wrappers to the functions they are wrapping.  The whole point is to
71494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   construct standard call sequences, but to do the call itself with a
71594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   special no-redirect call pseudo-instruction that the JIT
71694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   understands and handles specially.  This section is long and
71794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   repetitious, and I can't see a way to make it shorter.
71894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
71994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   The naming scheme is as follows:
72094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
72194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc}
72294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
72394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   'W' stands for "word" and 'v' for "void".  Hence there are
72494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   different macros for calling arity 0, 1, 2, 3, 4, etc, functions,
72594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   and for each, the possibility of returning a word-typed result, or
72694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   no result.
72794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
72894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
72994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Use these to write the name of your wrapper.  NOTE: duplicates
73094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. */
73194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
73294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Use an extra level of macroisation so as to ensure the soname/fnname
73394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   args are fully macro-expanded before pasting them together. */
73494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
73594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
73694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname)                    \
73794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VG_CONCAT4(_vgwZU_,soname,_,fnname)
73894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
73994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname)                    \
74094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VG_CONCAT4(_vgwZZ_,soname,_,fnname)
74194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
74294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Use this macro from within a wrapper function to collect the
74394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   context (address and possibly other info) of the original function.
74494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Once you have that you can then use it in one of the CALL_FN_
74594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   macros.  The type of the argument _lval is OrigFn. */
74694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_ORIG_FN(_lval)  VALGRIND_GET_NR_CONTEXT(_lval)
74794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
74894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Derivatives of the main macros below, for calling functions
74994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   returning void. */
75094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
75194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_v(fnptr)                                        \
75294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do { volatile unsigned long _junk;                             \
75394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        CALL_FN_W_v(_junk,fnptr); } while (0)
75494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
75594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_W(fnptr, arg1)                                  \
75694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do { volatile unsigned long _junk;                             \
75794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
75894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
75994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_WW(fnptr, arg1,arg2)                            \
76094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do { volatile unsigned long _junk;                             \
76194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
76294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
76394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3)                      \
76494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do { volatile unsigned long _junk;                             \
76594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
76694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
76794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4)                \
76894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do { volatile unsigned long _junk;                             \
76994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
77094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
77194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5)             \
77294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do { volatile unsigned long _junk;                             \
77394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
77494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
77594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6)        \
77694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do { volatile unsigned long _junk;                             \
77794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
77894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
77994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7)   \
78094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do { volatile unsigned long _junk;                             \
78194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
78294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
78394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- x86-{linux,darwin} ---------------- */
78494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
78594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)
78694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
78794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call.  No need to mention eax
78894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   as gcc can already see that, plus causes gcc to bomb. */
78994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx"
79094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
79194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned
79294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   long) == 4. */
79394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
79494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig)                                   \
79594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
79694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
79794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[1];                          \
79894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
79994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
80094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
80194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
80294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
80394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
80494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
80594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
80694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
80794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
80894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
80994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
81094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1)                             \
81194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
81294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
81394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[2];                          \
81494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
81594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
81694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
81794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
81894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subl $12, %%esp\n\t"                                    \
81994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
82094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
82194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
82294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $16, %%esp\n"                                      \
82394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
82494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
82594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
82694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
82794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
82894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
82994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
83094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
83194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
83294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
83394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3];                          \
83494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
83594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
83694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
83794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
83894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
83994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subl $8, %%esp\n\t"                                     \
84094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
84194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
84294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
84394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
84494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $16, %%esp\n"                                      \
84594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
84694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
84794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
84894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
84994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
85094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
85194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
85294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
85394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
85494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
85594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[4];                          \
85694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
85794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
85894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
85994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
86094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
86194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
86294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subl $4, %%esp\n\t"                                     \
86394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
86494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
86594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
86694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
86794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
86894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $16, %%esp\n"                                      \
86994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
87094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
87194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
87294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
87394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
87494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
87594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
87694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
87794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
87894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
87994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[5];                          \
88094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
88194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
88294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
88394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
88494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
88594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
88694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
88794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 16(%%eax)\n\t"                                    \
88894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
88994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
89094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
89194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
89294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
89394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $16, %%esp\n"                                      \
89494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
89594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
89694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
89794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
89894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
89994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
90094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
90194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
90294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
90394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
90494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[6];                          \
90594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
90694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
90794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
90894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
90994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
91094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
91194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
91294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
91394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subl $12, %%esp\n\t"                                    \
91494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 20(%%eax)\n\t"                                    \
91594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 16(%%eax)\n\t"                                    \
91694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
91794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
91894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
91994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
92094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
92194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $32, %%esp\n"                                      \
92294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
92394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
92494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
92594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
92694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
92794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
92894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
92994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
93094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
93194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
93294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[7];                          \
93394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
93494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
93594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
93694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
93794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
93894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
93994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
94094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
94194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
94294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subl $8, %%esp\n\t"                                     \
94394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 24(%%eax)\n\t"                                    \
94494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 20(%%eax)\n\t"                                    \
94594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 16(%%eax)\n\t"                                    \
94694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
94794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
94894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
94994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
95094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
95194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $32, %%esp\n"                                      \
95294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
95394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
95494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
95594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
95694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
95794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
95894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
95994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
96094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7)                            \
96194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
96294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
96394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[8];                          \
96494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
96594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
96694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
96794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
96894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
96994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
97094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
97194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
97294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
97394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
97494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subl $4, %%esp\n\t"                                     \
97594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 28(%%eax)\n\t"                                    \
97694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 24(%%eax)\n\t"                                    \
97794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 20(%%eax)\n\t"                                    \
97894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 16(%%eax)\n\t"                                    \
97994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
98094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
98194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
98294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
98394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
98494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $32, %%esp\n"                                      \
98594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
98694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
98794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
98894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
98994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
99094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
99194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
99294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
99394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8)                       \
99494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
99594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
99694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[9];                          \
99794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
99894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
99994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
100094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
100194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
100294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
100394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
100494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
100594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
100694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
100794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
100894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 32(%%eax)\n\t"                                    \
100994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 28(%%eax)\n\t"                                    \
101094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 24(%%eax)\n\t"                                    \
101194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 20(%%eax)\n\t"                                    \
101294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 16(%%eax)\n\t"                                    \
101394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
101494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
101594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
101694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
101794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
101894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $32, %%esp\n"                                      \
101994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
102094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
102194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
102294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
102394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
102494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
102594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
102694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
102794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8,arg9)                  \
102894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
102994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
103094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[10];                         \
103194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
103294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
103394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
103494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
103594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
103694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
103794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
103894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
103994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
104094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
104194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
104294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
104394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subl $12, %%esp\n\t"                                    \
104494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 36(%%eax)\n\t"                                    \
104594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 32(%%eax)\n\t"                                    \
104694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 28(%%eax)\n\t"                                    \
104794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 24(%%eax)\n\t"                                    \
104894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 20(%%eax)\n\t"                                    \
104994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 16(%%eax)\n\t"                                    \
105094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
105194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
105294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
105394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
105494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
105594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $48, %%esp\n"                                      \
105694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
105794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
105894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
105994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
106094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
106194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
106294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
106394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
106494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10)           \
106594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
106694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
106794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[11];                         \
106894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
106994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
107094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
107194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
107294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
107394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
107494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
107594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
107694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
107794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
107894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
107994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)(arg10);                       \
108094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
108194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subl $8, %%esp\n\t"                                     \
108294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 40(%%eax)\n\t"                                    \
108394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 36(%%eax)\n\t"                                    \
108494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 32(%%eax)\n\t"                                    \
108594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 28(%%eax)\n\t"                                    \
108694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 24(%%eax)\n\t"                                    \
108794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 20(%%eax)\n\t"                                    \
108894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 16(%%eax)\n\t"                                    \
108994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
109094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
109194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
109294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
109394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
109494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $48, %%esp\n"                                      \
109594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
109694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
109794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
109894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
109994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
110094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
110194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
110294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
110394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg6,arg7,arg8,arg9,arg10,      \
110494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg11)                          \
110594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
110694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
110794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[12];                         \
110894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
110994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
111094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
111194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
111294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
111394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
111494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
111594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
111694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
111794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
111894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
111994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)(arg10);                       \
112094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[11] = (unsigned long)(arg11);                       \
112194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
112294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subl $4, %%esp\n\t"                                     \
112394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 44(%%eax)\n\t"                                    \
112494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 40(%%eax)\n\t"                                    \
112594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 36(%%eax)\n\t"                                    \
112694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 32(%%eax)\n\t"                                    \
112794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 28(%%eax)\n\t"                                    \
112894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 24(%%eax)\n\t"                                    \
112994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 20(%%eax)\n\t"                                    \
113094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 16(%%eax)\n\t"                                    \
113194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
113294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
113394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
113494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
113594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
113694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $48, %%esp\n"                                      \
113794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
113894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
113994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
114094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
114194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
114294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
114394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
114494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
114594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg6,arg7,arg8,arg9,arg10,      \
114694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg11,arg12)                    \
114794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
114894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
114994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[13];                         \
115094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
115194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
115294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
115394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
115494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
115594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
115694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
115794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
115894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
115994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
116094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
116194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)(arg10);                       \
116294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[11] = (unsigned long)(arg11);                       \
116394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[12] = (unsigned long)(arg12);                       \
116494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
116594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 48(%%eax)\n\t"                                    \
116694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 44(%%eax)\n\t"                                    \
116794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 40(%%eax)\n\t"                                    \
116894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 36(%%eax)\n\t"                                    \
116994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 32(%%eax)\n\t"                                    \
117094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 28(%%eax)\n\t"                                    \
117194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 24(%%eax)\n\t"                                    \
117294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 20(%%eax)\n\t"                                    \
117394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 16(%%eax)\n\t"                                    \
117494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 12(%%eax)\n\t"                                    \
117594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 8(%%eax)\n\t"                                     \
117694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushl 4(%%eax)\n\t"                                     \
117794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
117894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_EAX                                \
117994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addl $48, %%esp\n"                                      \
118094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
118194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0])                            \
118294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
118394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
118494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
118594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
118694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
118794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_x86_linux || PLAT_x86_darwin */
118894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
118994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ amd64-{linux,darwin} --------------- */
119094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
119194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin)
119294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
119394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */
119494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
119594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */
119694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi",       \
119794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                            "rdi", "r8", "r9", "r10", "r11"
119894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
119994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* This is all pretty complex.  It's so as to make stack unwinding
120094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   work reliably.  See bug 243270.  The basic problem is the sub and
120194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   add of 128 of %rsp in all of the following macros.  If gcc believes
120294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   the CFA is in %rsp, then unwinding may fail, because what's at the
120394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   CFA is not what gcc "expected" when it constructs the CFIs for the
120494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   places where the macros are instantiated.
120594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
120694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   But we can't just add a CFI annotation to increase the CFA offset
120794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   by 128, to match the sub of 128 from %rsp, because we don't know
120894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   whether gcc has chosen %rsp as the CFA at that point, or whether it
120994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   has chosen some other register (eg, %rbp).  In the latter case,
121094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   adding a CFI annotation to change the CFA offset is simply wrong.
121194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
121294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   So the solution is to get hold of the CFA using
121394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __builtin_dwarf_cfa(), put it in a known register, and add a
121494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   CFI annotation to say what the register is.  We choose %rbp for
121594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   this (perhaps perversely), because:
121694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
121794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   (1) %rbp is already subject to unwinding.  If a new register was
121894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez       chosen then the unwinder would have to unwind it in all stack
121994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez       traces, which is expensive, and
122094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
122194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   (2) %rbp is already subject to precise exception updates in the
122294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez       JIT.  If a new register was chosen, we'd have to have precise
122394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez       exceptions for it too, which reduces performance of the
122494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez       generated code.
122594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
122694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   However .. one extra complication.  We can't just whack the result
122794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   of __builtin_dwarf_cfa() into %rbp and then add %rbp to the
122894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   list of trashed registers at the end of the inline assembly
122994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   fragments; gcc won't allow %rbp to appear in that list.  Hence
123094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   instead we need to stash %rbp in %r15 for the duration of the asm,
123194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   and say that %r15 is trashed instead.  gcc seems happy to go with
123294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   that.
123394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
123494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Oh .. and this all needs to be conditionalised so that it is
123594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   unchanged from before this commit, when compiled with older gccs
123694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   that don't support __builtin_dwarf_cfa.  Furthermore, since
123794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   this header file is freestanding, it has to be independent of
123894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   config.h, and so the following conditionalisation cannot depend on
123994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   configure time checks.
124094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
124194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Although it's not clear from
124294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)',
124394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   this expression excludes Darwin.
124494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   .cfi directives in Darwin assembly appear to be completely
124594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   different and I haven't investigated how they work.
124694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
124794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   For even more entertainment value, note we have to use the
124894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   completely undocumented __builtin_dwarf_cfa(), which appears to
124994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   really compute the CFA, whereas __builtin_frame_address(0) claims
125094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   to but actually doesn't.  See
125194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   https://bugs.kde.org/show_bug.cgi?id=243270#c47
125294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
125394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
125494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define __FRAME_POINTER                                         \
125594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      ,"r"(__builtin_dwarf_cfa())
125694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define VALGRIND_CFI_PROLOGUE                                   \
125794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      "movq %%rbp, %%r15\n\t"                                     \
125894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      "movq %2, %%rbp\n\t"                                        \
125994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      ".cfi_remember_state\n\t"                                   \
126094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      ".cfi_def_cfa rbp, 0\n\t"
126194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define VALGRIND_CFI_EPILOGUE                                   \
126294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      "movq %%r15, %%rbp\n\t"                                     \
126394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      ".cfi_restore_state\n\t"
126494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else
126594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define __FRAME_POINTER
126694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define VALGRIND_CFI_PROLOGUE
126794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define VALGRIND_CFI_EPILOGUE
126894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
126994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
127094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
127194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned
127294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   long) == 8. */
127394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
127494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* NB 9 Sept 07.  There is a nasty kludge here in all these CALL_FN_
127594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   macros.  In order not to trash the stack redzone, we need to drop
127694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   %rsp by 128 before the hidden call, and restore afterwards.  The
127794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   nastyness is that it is only by luck that the stack still appears
127894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   to be unwindable during the hidden call - since then the behaviour
127994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   of any routine using this macro does not match what the CFI data
128094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   says.  Sigh.
128194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
128294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Why is this important?  Imagine that a wrapper has a stack
128394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   allocated local, and passes to the hidden call, a pointer to it.
128494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Because gcc does not know about the hidden call, it may allocate
128594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   that local in the redzone.  Unfortunately the hidden call may then
128694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   trash it before it comes to use it.  So we must step clear of the
128794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   redzone, for the duration of the hidden call, to make it safe.
128894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
128994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Probably the same problem afflicts the other redzone-style ABIs too
129094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   (ppc64-linux, ppc32-aix5, ppc64-aix5); but for those, the stack is
129194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   self describing (none of this CFI nonsense) so at least messing
129294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   with the stack pointer doesn't give a danger of non-unwindable
129394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   stack. */
129494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
129594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig)                                   \
129694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
129794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
129894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[1];                          \
129994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
130094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
130194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
130294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
130394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
130494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
130594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
130694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
130794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
130894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
130994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
131094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
131194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
131294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
131394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
131494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
131594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1)                             \
131694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
131794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
131894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[2];                          \
131994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
132094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
132194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
132294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
132394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
132494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
132594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
132694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
132794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
132894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
132994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
133094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
133194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
133294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
133394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
133494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
133594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
133694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
133794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
133894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
133994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
134094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3];                          \
134194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
134294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
134394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
134494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
134594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
134694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
134794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
134894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
134994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
135094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
135194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
135294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
135394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
135494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
135594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
135694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
135794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
135894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
135994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
136094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
136194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
136294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
136394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
136494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[4];                          \
136594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
136694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
136794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
136894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
136994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
137094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
137194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
137294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
137394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
137494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
137594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
137694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
137794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
137894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
137994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
138094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
138194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
138294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
138394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
138494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
138594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
138694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
138794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
138894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
138994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
139094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[5];                          \
139194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
139294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
139394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
139494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
139594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
139694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
139794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
139894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
139994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
140094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 32(%%rax), %%rcx\n\t"                              \
140194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
140294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
140394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
140494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
140594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
140694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
140794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
140894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
140994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
141094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
141194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
141294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
141394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
141494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
141594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
141694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
141794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
141894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[6];                          \
141994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
142094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
142194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
142294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
142394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
142494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
142594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
142694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
142794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
142894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
142994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 40(%%rax), %%r8\n\t"                               \
143094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 32(%%rax), %%rcx\n\t"                              \
143194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
143294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
143394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
143494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
143594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
143694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
143794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
143894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
143994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
144094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
144194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
144294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
144394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
144494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
144594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
144694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
144794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
144894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[7];                          \
144994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
145094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
145194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
145294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
145394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
145494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
145594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
145694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
145794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
145894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
145994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
146094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 48(%%rax), %%r9\n\t"                               \
146194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 40(%%rax), %%r8\n\t"                               \
146294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 32(%%rax), %%rcx\n\t"                              \
146394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
146494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
146594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
146694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
146794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
146894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
146994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
147094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
147194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
147294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
147394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
147494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
147594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
147694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
147794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
147894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7)                            \
147994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
148094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
148194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[8];                          \
148294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
148394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
148494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
148594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
148694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
148794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
148894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
148994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
149094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
149194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
149294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
149394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $136,%%rsp\n\t"                                    \
149494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 56(%%rax)\n\t"                                    \
149594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 48(%%rax), %%r9\n\t"                               \
149694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 40(%%rax), %%r8\n\t"                               \
149794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 32(%%rax), %%rcx\n\t"                              \
149894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
149994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
150094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
150194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
150294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
150394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $8, %%rsp\n"                                       \
150494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $136,%%rsp\n\t"                                    \
150594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
150694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
150794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
150894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
150994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
151094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
151194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
151294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
151394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
151494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8)                       \
151594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
151694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
151794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[9];                          \
151894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
151994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
152094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
152194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
152294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
152394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
152494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
152594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
152694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
152794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
152894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
152994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
153094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
153194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 64(%%rax)\n\t"                                    \
153294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 56(%%rax)\n\t"                                    \
153394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 48(%%rax), %%r9\n\t"                               \
153494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 40(%%rax), %%r8\n\t"                               \
153594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 32(%%rax), %%rcx\n\t"                              \
153694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
153794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
153894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
153994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
154094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
154194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $16, %%rsp\n"                                      \
154294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
154394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
154494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
154594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
154694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
154794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
154894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
154994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
155094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
155194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
155294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8,arg9)                  \
155394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
155494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
155594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[10];                         \
155694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
155794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
155894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
155994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
156094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
156194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
156294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
156394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
156494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
156594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
156694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
156794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
156894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
156994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $136,%%rsp\n\t"                                    \
157094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 72(%%rax)\n\t"                                    \
157194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 64(%%rax)\n\t"                                    \
157294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 56(%%rax)\n\t"                                    \
157394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 48(%%rax), %%r9\n\t"                               \
157494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 40(%%rax), %%r8\n\t"                               \
157594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 32(%%rax), %%rcx\n\t"                              \
157694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
157794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
157894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
157994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
158094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
158194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $24, %%rsp\n"                                      \
158294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $136,%%rsp\n\t"                                    \
158394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
158494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
158594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
158694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
158794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
158894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
158994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
159094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
159194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
159294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10)           \
159394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
159494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
159594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[11];                         \
159694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
159794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
159894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
159994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
160094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
160194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
160294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
160394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
160494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
160594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
160694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
160794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)(arg10);                       \
160894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
160994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
161094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
161194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 80(%%rax)\n\t"                                    \
161294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 72(%%rax)\n\t"                                    \
161394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 64(%%rax)\n\t"                                    \
161494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 56(%%rax)\n\t"                                    \
161594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 48(%%rax), %%r9\n\t"                               \
161694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 40(%%rax), %%r8\n\t"                               \
161794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 32(%%rax), %%rcx\n\t"                              \
161894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
161994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
162094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
162194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
162294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
162394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $32, %%rsp\n"                                      \
162494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
162594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
162694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
162794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
162894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
162994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
163094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
163194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
163294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
163394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
163494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10,arg11)     \
163594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
163694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
163794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[12];                         \
163894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
163994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
164094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
164194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
164294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
164394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
164494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
164594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
164694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
164794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
164894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
164994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)(arg10);                       \
165094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[11] = (unsigned long)(arg11);                       \
165194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
165294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
165394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $136,%%rsp\n\t"                                    \
165494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 88(%%rax)\n\t"                                    \
165594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 80(%%rax)\n\t"                                    \
165694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 72(%%rax)\n\t"                                    \
165794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 64(%%rax)\n\t"                                    \
165894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 56(%%rax)\n\t"                                    \
165994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 48(%%rax), %%r9\n\t"                               \
166094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 40(%%rax), %%r8\n\t"                               \
166194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 32(%%rax), %%rcx\n\t"                              \
166294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
166394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
166494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
166594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
166694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
166794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $40, %%rsp\n"                                      \
166894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $136,%%rsp\n\t"                                    \
166994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
167094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
167194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
167294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
167394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
167494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
167594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
167694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
167794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
167894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                arg7,arg8,arg9,arg10,arg11,arg12) \
167994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
168094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
168194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[13];                         \
168294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
168394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
168494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
168594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
168694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
168794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
168894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
168994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
169094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
169194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
169294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
169394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)(arg10);                       \
169494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[11] = (unsigned long)(arg11);                       \
169594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[12] = (unsigned long)(arg12);                       \
169694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
169794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_PROLOGUE                                    \
169894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "subq $128,%%rsp\n\t"                                    \
169994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 96(%%rax)\n\t"                                    \
170094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 88(%%rax)\n\t"                                    \
170194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 80(%%rax)\n\t"                                    \
170294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 72(%%rax)\n\t"                                    \
170394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 64(%%rax)\n\t"                                    \
170494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "pushq 56(%%rax)\n\t"                                    \
170594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 48(%%rax), %%r9\n\t"                               \
170694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 40(%%rax), %%r8\n\t"                               \
170794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 32(%%rax), %%rcx\n\t"                              \
170894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 24(%%rax), %%rdx\n\t"                              \
170994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 16(%%rax), %%rsi\n\t"                              \
171094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq 8(%%rax), %%rdi\n\t"                               \
171194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
171294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CALL_NOREDIR_RAX                                \
171394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $48, %%rsp\n"                                      \
171494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addq $128,%%rsp\n\t"                                    \
171594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_CFI_EPILOGUE                                    \
171694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=a" (_res)                                  \
171794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
171894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
171994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
172094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
172194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
172294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
172394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
172494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
172594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc32-linux ------------------------ */
172694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
172794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc32_linux)
172894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
172994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* This is useful for finding out about the on-stack stuff:
173094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
173194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   extern int f9  ( int,int,int,int,int,int,int,int,int );
173294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   extern int f10 ( int,int,int,int,int,int,int,int,int,int );
173394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   extern int f11 ( int,int,int,int,int,int,int,int,int,int,int );
173494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int );
173594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
173694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   int g9 ( void ) {
173794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      return f9(11,22,33,44,55,66,77,88,99);
173894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
173994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   int g10 ( void ) {
174094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      return f10(11,22,33,44,55,66,77,88,99,110);
174194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
174294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   int g11 ( void ) {
174394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      return f11(11,22,33,44,55,66,77,88,99,110,121);
174494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
174594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   int g12 ( void ) {
174694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      return f12(11,22,33,44,55,66,77,88,99,110,121,132);
174794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
174894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
174994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
175094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
175194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
175294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */
175394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS                                       \
175494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "lr", "ctr", "xer",                                            \
175594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
175694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
175794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "r11", "r12", "r13"
175894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
175994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on ppc32-linux,
176094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   sizeof(unsigned long) == 4. */
176194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
176294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig)                                   \
176394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
176494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
176594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[1];                          \
176694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
176794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
176894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
176994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
177094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
177194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
177294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
177394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
177494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
177594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
177694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
177794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
177894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
177994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
178094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1)                             \
178194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
178294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
178394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[2];                          \
178494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
178594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
178694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
178794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
178894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
178994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
179094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
179194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
179294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
179394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
179494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
179594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
179694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
179794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
179894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
179994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
180094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
180194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
180294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
180394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3];                          \
180494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
180594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
180694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
180794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
180894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
180994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
181094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
181194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
181294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
181394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
181494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
181594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
181694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
181794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
181894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
181994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
182094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
182194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
182294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
182394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
182494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
182594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[4];                          \
182694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
182794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
182894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
182994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
183094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
183194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
183294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
183394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
183494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
183594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
183694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
183794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
183894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
183994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
184094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
184194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
184294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
184394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
184494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
184594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
184694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
184794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
184894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
184994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[5];                          \
185094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
185194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
185294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
185394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
185494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
185594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)arg4;                           \
185694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
185794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
185894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
185994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
186094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
186194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
186294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
186394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
186494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
186594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
186694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
186794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
186894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
186994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
187094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
187194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
187294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
187394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
187494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
187594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[6];                          \
187694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
187794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
187894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
187994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
188094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
188194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)arg4;                           \
188294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)arg5;                           \
188394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
188494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
188594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
188694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
188794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
188894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
188994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 7,20(11)\n\t"                                       \
189094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
189194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
189294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
189394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
189494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
189594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
189694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
189794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
189894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
189994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
190094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
190194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
190294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
190394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[7];                          \
190494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
190594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
190694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
190794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
190894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
190994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)arg4;                           \
191094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)arg5;                           \
191194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)arg6;                           \
191294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
191394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
191494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
191594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
191694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
191794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
191894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 7,20(11)\n\t"                                       \
191994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 8,24(11)\n\t"                                       \
192094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
192194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
192294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
192394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
192494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
192594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
192694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
192794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
192894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
192994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
193094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
193194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7)                            \
193294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
193394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
193494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[8];                          \
193594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
193694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
193794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
193894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
193994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
194094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)arg4;                           \
194194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)arg5;                           \
194294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)arg6;                           \
194394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)arg7;                           \
194494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
194594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
194694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
194794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
194894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
194994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
195094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 7,20(11)\n\t"                                       \
195194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 8,24(11)\n\t"                                       \
195294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 9,28(11)\n\t"                                       \
195394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
195494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
195594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
195694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
195794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
195894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
195994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
196094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
196194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
196294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
196394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
196494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8)                       \
196594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
196694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
196794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[9];                          \
196894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
196994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
197094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
197194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
197294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
197394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)arg4;                           \
197494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)arg5;                           \
197594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)arg6;                           \
197694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)arg7;                           \
197794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)arg8;                           \
197894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
197994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
198094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
198194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
198294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
198394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
198494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 7,20(11)\n\t"                                       \
198594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 8,24(11)\n\t"                                       \
198694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 9,28(11)\n\t"                                       \
198794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
198894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
198994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
199094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
199194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
199294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
199394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
199494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
199594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
199694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
199794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
199894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
199994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8,arg9)                  \
200094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
200194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
200294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[10];                         \
200394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
200494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
200594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
200694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
200794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
200894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)arg4;                           \
200994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)arg5;                           \
201094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)arg6;                           \
201194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)arg7;                           \
201294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)arg8;                           \
201394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)arg9;                           \
201494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
201594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
201694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-16\n\t"                                       \
201794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
201894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,36(11)\n\t"                                       \
201994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,8(1)\n\t"                                         \
202094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
202194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
202294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
202394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
202494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
202594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 7,20(11)\n\t"                                       \
202694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 8,24(11)\n\t"                                       \
202794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 9,28(11)\n\t"                                       \
202894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
202994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
203094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
203194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,16\n\t"                                        \
203294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
203394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
203494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
203594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
203694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
203794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
203894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
203994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
204094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
204194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10)           \
204294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
204394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
204494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[11];                         \
204594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
204694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
204794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
204894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
204994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
205094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)arg4;                           \
205194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)arg5;                           \
205294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)arg6;                           \
205394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)arg7;                           \
205494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)arg8;                           \
205594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)arg9;                           \
205694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)arg10;                         \
205794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
205894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
205994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-16\n\t"                                       \
206094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
206194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,40(11)\n\t"                                       \
206294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,12(1)\n\t"                                        \
206394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
206494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,36(11)\n\t"                                       \
206594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,8(1)\n\t"                                         \
206694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
206794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
206894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
206994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
207094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
207194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 7,20(11)\n\t"                                       \
207294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 8,24(11)\n\t"                                       \
207394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 9,28(11)\n\t"                                       \
207494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
207594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
207694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
207794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,16\n\t"                                        \
207894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
207994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
208094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
208194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
208294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
208394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
208494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
208594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
208694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
208794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10,arg11)     \
208894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
208994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
209094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[12];                         \
209194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
209294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
209394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
209494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
209594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
209694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)arg4;                           \
209794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)arg5;                           \
209894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)arg6;                           \
209994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)arg7;                           \
210094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)arg8;                           \
210194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)arg9;                           \
210294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)arg10;                         \
210394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[11] = (unsigned long)arg11;                         \
210494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
210594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
210694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-32\n\t"                                       \
210794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg11 */                                              \
210894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,44(11)\n\t"                                       \
210994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,16(1)\n\t"                                        \
211094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
211194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,40(11)\n\t"                                       \
211294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,12(1)\n\t"                                        \
211394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
211494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,36(11)\n\t"                                       \
211594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,8(1)\n\t"                                         \
211694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
211794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
211894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
211994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
212094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
212194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 7,20(11)\n\t"                                       \
212294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 8,24(11)\n\t"                                       \
212394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 9,28(11)\n\t"                                       \
212494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
212594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
212694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
212794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,32\n\t"                                        \
212894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
212994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
213094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
213194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
213294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
213394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
213494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
213594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
213694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
213794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                arg7,arg8,arg9,arg10,arg11,arg12) \
213894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
213994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
214094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[13];                         \
214194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
214294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
214394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)arg1;                           \
214494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)arg2;                           \
214594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)arg3;                           \
214694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)arg4;                           \
214794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)arg5;                           \
214894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)arg6;                           \
214994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)arg7;                           \
215094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)arg8;                           \
215194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)arg9;                           \
215294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)arg10;                         \
215394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[11] = (unsigned long)arg11;                         \
215494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[12] = (unsigned long)arg12;                         \
215594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
215694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
215794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-32\n\t"                                       \
215894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg12 */                                              \
215994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,48(11)\n\t"                                       \
216094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,20(1)\n\t"                                        \
216194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg11 */                                              \
216294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,44(11)\n\t"                                       \
216394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,16(1)\n\t"                                        \
216494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
216594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,40(11)\n\t"                                       \
216694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,12(1)\n\t"                                        \
216794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
216894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,36(11)\n\t"                                       \
216994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,8(1)\n\t"                                         \
217094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
217194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
217294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 4,8(11)\n\t"                                        \
217394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 5,12(11)\n\t"                                       \
217494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
217594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 7,20(11)\n\t"                                       \
217694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 8,24(11)\n\t"                                       \
217794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 9,28(11)\n\t"                                       \
217894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
217994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
218094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
218194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,32\n\t"                                        \
218294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3"                                                \
218394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
218494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[0])                            \
218594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
218694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
218794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
218894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
218994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
219094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc32_linux */
219194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
219294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc64-linux ------------------------ */
219394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
219494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc64_linux)
219594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
219694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
219794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
219894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */
219994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS                                       \
220094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "lr", "ctr", "xer",                                            \
220194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
220294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
220394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "r11", "r12", "r13"
220494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
220594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
220694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   long) == 8. */
220794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
220894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig)                                   \
220994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
221094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
221194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+0];                        \
221294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
221394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
221494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)_orig.r2;                       \
221594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)_orig.nraddr;                   \
221694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
221794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
221894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
221994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
222094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
222194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
222294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
222394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
222494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)" /* restore tocptr */                      \
222594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
222694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
222794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
222894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
222994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
223094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
223194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
223294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1)                             \
223394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
223494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
223594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+1];                        \
223694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
223794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
223894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
223994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
224094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
224194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
224294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
224394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
224494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
224594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
224694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
224794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
224894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
224994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
225094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)" /* restore tocptr */                      \
225194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
225294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
225394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
225494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
225594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
225694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
225794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
225894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
225994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
226094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
226194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+2];                        \
226294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
226394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
226494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
226594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
226694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
226794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
226894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
226994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
227094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
227194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
227294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
227394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
227494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
227594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
227694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
227794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
227894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)" /* restore tocptr */                      \
227994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
228094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
228194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
228294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
228394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
228494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
228594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
228694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
228794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
228894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
228994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+3];                        \
229094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
229194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
229294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
229394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
229494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
229594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
229694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
229794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
229894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
229994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
230094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
230194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
230294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
230394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
230494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
230594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
230694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
230794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
230894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)" /* restore tocptr */                      \
230994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
231094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
231194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
231294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
231394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
231494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
231594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
231694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
231794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
231894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
231994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+4];                        \
232094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
232194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
232294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
232394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
232494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
232594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
232694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
232794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
232894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
232994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
233094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
233194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
233294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
233394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
233494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
233594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
233694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
233794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
233894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
233994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
234094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)" /* restore tocptr */                      \
234194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
234294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
234394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
234494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
234594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
234694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
234794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
234894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
234994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
235094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
235194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+5];                        \
235294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
235394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
235494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
235594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
235694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
235794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
235894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
235994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
236094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
236194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
236294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
236394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
236494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
236594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
236694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
236794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
236894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
236994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
237094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
237194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
237294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
237394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
237494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)" /* restore tocptr */                      \
237594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
237694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
237794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
237894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
237994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
238094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
238194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
238294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
238394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
238494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
238594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+6];                        \
238694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
238794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
238894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
238994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
239094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
239194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
239294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
239394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
239494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
239594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
239694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
239794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
239894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
239994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
240094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
240194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
240294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
240394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
240494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
240594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
240694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
240794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
240894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
240994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
241094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)" /* restore tocptr */                      \
241194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
241294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
241394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
241494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
241594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
241694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
241794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
241894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
241994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7)                            \
242094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
242194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
242294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+7];                        \
242394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
242494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
242594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
242694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
242794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
242894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
242994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
243094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
243194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
243294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
243394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
243494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
243594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
243694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
243794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
243894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
243994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
244094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
244194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
244294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
244394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
244494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
244594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
244694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
244794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
244894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
244994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)" /* restore tocptr */                      \
245094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
245194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
245294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
245394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
245494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
245594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
245694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
245794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
245894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8)                       \
245994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
246094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
246194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+8];                        \
246294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
246394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
246494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
246594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
246694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
246794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
246894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
246994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
247094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
247194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
247294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
247394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
247494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
247594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
247694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
247794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
247894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
247994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
248094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
248194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
248294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
248394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
248494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
248594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
248694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
248794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
248894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
248994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
249094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)" /* restore tocptr */                      \
249194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
249294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
249394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
249494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
249594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
249694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
249794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
249894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
249994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8,arg9)                  \
250094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
250194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
250294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+9];                        \
250394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
250494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
250594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
250694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
250794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
250894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
250994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
251094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
251194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
251294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
251394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
251494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
251594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
251694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
251794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
251894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
251994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
252094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-128\n\t"  /* expand stack frame */            \
252194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
252294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,72(11)\n\t"                                       \
252394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,112(1)\n\t"                                       \
252494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
252594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
252694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
252794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
252894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
252994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
253094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
253194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
253294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
253394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
253494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
253594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
253694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
253794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
253894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,128"     /* restore frame */                   \
253994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
254094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
254194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
254294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
254394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
254494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
254594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
254694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
254794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10)           \
254894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
254994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
255094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+10];                       \
255194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
255294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
255394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
255494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
255594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
255694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
255794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
255894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
255994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
256094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
256194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
256294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
256394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
256494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+10] = (unsigned long)arg10;                       \
256594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
256694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
256794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
256894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
256994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-128\n\t"  /* expand stack frame */            \
257094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
257194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,80(11)\n\t"                                       \
257294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,120(1)\n\t"                                       \
257394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
257494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,72(11)\n\t"                                       \
257594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,112(1)\n\t"                                       \
257694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
257794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
257894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
257994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
258094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
258194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
258294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
258394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
258494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
258594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
258694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
258794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
258894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
258994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
259094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,128"     /* restore frame */                   \
259194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
259294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
259394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
259494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
259594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
259694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
259794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
259894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
259994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10,arg11)     \
260094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
260194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
260294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+11];                       \
260394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
260494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
260594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
260694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
260794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
260894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
260994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
261094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
261194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
261294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
261394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
261494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
261594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
261694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+10] = (unsigned long)arg10;                       \
261794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+11] = (unsigned long)arg11;                       \
261894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
261994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
262094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
262194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
262294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-144\n\t"  /* expand stack frame */            \
262394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg11 */                                              \
262494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,88(11)\n\t"                                       \
262594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,128(1)\n\t"                                       \
262694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
262794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,80(11)\n\t"                                       \
262894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,120(1)\n\t"                                       \
262994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
263094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,72(11)\n\t"                                       \
263194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,112(1)\n\t"                                       \
263294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
263394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
263494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
263594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
263694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
263794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
263894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
263994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
264094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
264194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
264294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
264394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
264494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
264594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
264694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,144"     /* restore frame */                   \
264794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
264894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
264994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
265094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
265194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
265294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
265394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
265494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
265594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                arg7,arg8,arg9,arg10,arg11,arg12) \
265694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
265794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
265894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+12];                       \
265994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
266094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
266194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
266294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
266394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
266494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
266594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
266694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
266794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
266894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
266994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
267094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
267194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
267294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+10] = (unsigned long)arg10;                       \
267394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+11] = (unsigned long)arg11;                       \
267494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+12] = (unsigned long)arg12;                       \
267594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
267694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
267794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 2,-16(11)\n\t"  /* save tocptr */                   \
267894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
267994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-144\n\t"  /* expand stack frame */            \
268094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg12 */                                              \
268194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,96(11)\n\t"                                       \
268294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,136(1)\n\t"                                       \
268394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg11 */                                              \
268494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,88(11)\n\t"                                       \
268594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,128(1)\n\t"                                       \
268694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
268794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,80(11)\n\t"                                       \
268894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,120(1)\n\t"                                       \
268994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
269094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,72(11)\n\t"                                       \
269194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,112(1)\n\t"                                       \
269294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
269394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
269494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
269594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
269694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
269794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
269894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
269994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
270094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
270194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
270294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
270394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
270494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
270594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
270694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,144"     /* restore frame */                   \
270794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
270894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
270994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
271094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
271194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
271294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
271394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
271494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc64_linux */
271594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
271694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- arm-linux ------------------------- */
271794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
271894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_arm_linux)
271994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
272094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */
272194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14"
272294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
272394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned
272494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   long) == 4. */
272594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
272694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig)                                   \
272794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
272894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
272994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[1];                          \
273094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
273194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
273294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
273394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
273494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
273594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0\n"                                           \
273694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
273794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
273894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
273994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
274094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
274194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
274294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
274394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1)                             \
274494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
274594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
274694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[2];                          \
274794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
274894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
274994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
275094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
275194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
275294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
275394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
275494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0\n"                                           \
275594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
275694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
275794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory",  __CALLER_SAVED_REGS         \
275894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
275994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
276094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
276194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
276294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
276394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
276494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
276594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3];                          \
276694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
276794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
276894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
276994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
277094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
277194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
277294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
277394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
277494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
277594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0\n"                                           \
277694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
277794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
277894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
277994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
278094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
278194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
278294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
278394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
278494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
278594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
278694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[4];                          \
278794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
278894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
278994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
279094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
279194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
279294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
279394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
279494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
279594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
279694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
279794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
279894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0\n"                                           \
279994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
280094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
280194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
280294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
280394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
280494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
280594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
280694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
280794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
280894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
280994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[5];                          \
281094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
281194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
281294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
281394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
281494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
281594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
281694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
281794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
281894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
281994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
282094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #16] \n\t"                                 \
282194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
282294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
282394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0"                                             \
282494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
282594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
282694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
282794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
282894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
282994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
283094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
283194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
283294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
283394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
283494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[6];                          \
283594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
283694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
283794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
283894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
283994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
284094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
284194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
284294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
284394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #20] \n\t"                                 \
284494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0} \n\t"                                         \
284594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
284694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
284794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
284894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #16] \n\t"                                 \
284994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
285094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
285194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "add sp, sp, #4 \n\t"                                    \
285294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0"                                             \
285394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
285494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
285594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
285694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
285794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
285894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
285994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
286094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
286194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
286294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
286394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[7];                          \
286494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
286594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
286694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
286794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
286894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
286994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
287094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
287194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
287294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
287394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #20] \n\t"                                 \
287494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #24] \n\t"                                 \
287594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0, r1} \n\t"                                     \
287694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
287794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
287894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
287994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #16] \n\t"                                 \
288094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
288194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
288294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "add sp, sp, #8 \n\t"                                    \
288394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0"                                             \
288494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
288594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
288694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
288794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
288894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
288994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
289094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
289194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
289294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7)                            \
289394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
289494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
289594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[8];                          \
289694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
289794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
289894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
289994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
290094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
290194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
290294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
290394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
290494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
290594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
290694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #20] \n\t"                                 \
290794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #24] \n\t"                                 \
290894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #28] \n\t"                                 \
290994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0, r1, r2} \n\t"                                 \
291094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
291194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
291294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
291394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #16] \n\t"                                 \
291494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
291594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
291694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "add sp, sp, #12 \n\t"                                   \
291794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0"                                             \
291894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
291994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
292094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
292194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
292294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
292394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
292494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
292594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
292694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8)                       \
292794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
292894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
292994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[9];                          \
293094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
293194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
293294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
293394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
293494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
293594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
293694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
293794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
293894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
293994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
294094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
294194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #20] \n\t"                                 \
294294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #24] \n\t"                                 \
294394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #28] \n\t"                                 \
294494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #32] \n\t"                                 \
294594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0, r1, r2, r3} \n\t"                             \
294694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
294794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
294894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
294994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #16] \n\t"                                 \
295094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
295194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
295294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "add sp, sp, #16 \n\t"                                   \
295394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0"                                             \
295494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
295594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
295694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
295794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
295894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
295994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
296094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
296194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
296294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8,arg9)                  \
296394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
296494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
296594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[10];                         \
296694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
296794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
296894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
296994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
297094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
297194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
297294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
297394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
297494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
297594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
297694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
297794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
297894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #20] \n\t"                                 \
297994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #24] \n\t"                                 \
298094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #28] \n\t"                                 \
298194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #32] \n\t"                                 \
298294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1, #36] \n\t"                                 \
298394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0, r1, r2, r3, r4} \n\t"                         \
298494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
298594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
298694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
298794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #16] \n\t"                                 \
298894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
298994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
299094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "add sp, sp, #20 \n\t"                                   \
299194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0"                                             \
299294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
299394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
299494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
299594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
299694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
299794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
299894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
299994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
300094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10)           \
300194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
300294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
300394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[11];                         \
300494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
300594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
300694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
300794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
300894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
300994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
301094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
301194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
301294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
301394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
301494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
301594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)(arg10);                       \
301694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
301794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #40] \n\t"                                 \
301894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0} \n\t"                                         \
301994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #20] \n\t"                                 \
302094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #24] \n\t"                                 \
302194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #28] \n\t"                                 \
302294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #32] \n\t"                                 \
302394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1, #36] \n\t"                                 \
302494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0, r1, r2, r3, r4} \n\t"                         \
302594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
302694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
302794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
302894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #16] \n\t"                                 \
302994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
303094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
303194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "add sp, sp, #24 \n\t"                                   \
303294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0"                                             \
303394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
303494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
303594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
303694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
303794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
303894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
303994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
304094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
304194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg6,arg7,arg8,arg9,arg10,      \
304294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg11)                          \
304394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
304494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
304594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[12];                         \
304694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
304794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
304894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
304994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
305094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
305194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
305294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
305394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
305494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
305594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
305694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
305794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)(arg10);                       \
305894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[11] = (unsigned long)(arg11);                       \
305994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
306094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #40] \n\t"                                 \
306194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #44] \n\t"                                 \
306294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0, r1} \n\t"                                     \
306394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #20] \n\t"                                 \
306494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #24] \n\t"                                 \
306594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #28] \n\t"                                 \
306694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #32] \n\t"                                 \
306794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1, #36] \n\t"                                 \
306894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0, r1, r2, r3, r4} \n\t"                         \
306994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
307094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
307194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
307294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #16] \n\t"                                 \
307394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
307494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
307594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "add sp, sp, #28 \n\t"                                   \
307694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0"                                             \
307794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
307894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
307994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory",__CALLER_SAVED_REGS           \
308094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
308194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
308294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
308394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
308494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
308594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg6,arg7,arg8,arg9,arg10,      \
308694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg11,arg12)                    \
308794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
308894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
308994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[13];                         \
309094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
309194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[0] = (unsigned long)_orig.nraddr;                   \
309294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)(arg1);                         \
309394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)(arg2);                         \
309494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[3] = (unsigned long)(arg3);                         \
309594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[4] = (unsigned long)(arg4);                         \
309694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[5] = (unsigned long)(arg5);                         \
309794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[6] = (unsigned long)(arg6);                         \
309894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[7] = (unsigned long)(arg7);                         \
309994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[8] = (unsigned long)(arg8);                         \
310094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[9] = (unsigned long)(arg9);                         \
310194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[10] = (unsigned long)(arg10);                       \
310294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[11] = (unsigned long)(arg11);                       \
310394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[12] = (unsigned long)(arg12);                       \
310494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
310594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #40] \n\t"                                 \
310694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #44] \n\t"                                 \
310794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #48] \n\t"                                 \
310894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0, r1, r2} \n\t"                                 \
310994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #20] \n\t"                                 \
311094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #24] \n\t"                                 \
311194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #28] \n\t"                                 \
311294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #32] \n\t"                                 \
311394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1, #36] \n\t"                                 \
311494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "push {r0, r1, r2, r3, r4} \n\t"                         \
311594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r0, [%1, #4] \n\t"                                  \
311694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r1, [%1, #8] \n\t"                                  \
311794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r2, [%1, #12] \n\t"                                 \
311894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r3, [%1, #16] \n\t"                                 \
311994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
312094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
312194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "add sp, sp, #32 \n\t"                                   \
312294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mov %0, r0"                                             \
312394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
312494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "0" (&_argvec[0])                            \
312594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
312694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
312794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
312894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
312994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
313094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_arm_linux */
313194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
313294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc32-aix5 ------------------------- */
313394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
313494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc32_aix5)
313594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
313694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
313794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
313894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */
313994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS                                       \
314094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "lr", "ctr", "xer",                                            \
314194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
314294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
314394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "r11", "r12", "r13"
314494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
314594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Expand the stack frame, copying enough info that unwinding
314694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   still works.  Trashes r3. */
314794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
314894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr)                      \
314994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-" #_n_fr "\n\t"                               \
315094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3," #_n_fr "(1)\n\t"                               \
315194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  3,0(1)\n\t"
315294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
315394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_CONTRACT_FRAME_BY(_n_fr)                               \
315494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1," #_n_fr "\n\t"
315594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
315694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on ppc32-aix5, sizeof(unsigned
315794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   long) == 4. */
315894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
315994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig)                                   \
316094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
316194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
316294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+0];                        \
316394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
316494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
316594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)_orig.r2;                       \
316694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)_orig.nraddr;                   \
316794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
316894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
316994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
317094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
317194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
317294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
317394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
317494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
317594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
317694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
317794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
317894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
317994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
318094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
318194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
318294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
318394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
318494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
318594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1)                             \
318694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
318794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
318894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+1];                        \
318994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
319094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
319194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
319294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
319394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
319494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
319594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
319694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
319794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
319894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
319994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
320094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
320194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
320294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
320394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
320494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
320594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
320694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
320794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
320894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
320994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
321094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
321194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
321294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
321394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
321494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
321594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
321694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+2];                        \
321794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
321894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
321994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
322094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
322194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
322294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
322394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
322494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
322594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
322694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
322794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
322894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
322994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
323094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
323194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
323294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
323394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
323494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
323594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
323694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
323794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
323894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
323994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
324094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
324194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
324294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
324394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
324494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
324594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
324694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+3];                        \
324794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
324894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
324994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
325094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
325194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
325294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
325394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
325494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
325594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
325694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
325794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
325894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
325994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
326094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
326194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
326294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
326394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
326494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
326594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
326694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
326794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
326894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
326994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
327094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
327194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
327294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
327394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
327494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
327594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
327694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
327794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
327894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+4];                        \
327994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
328094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
328194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
328294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
328394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
328494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
328594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
328694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
328794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
328894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
328994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
329094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
329194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
329294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
329394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
329494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
329594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
329694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
329794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
329894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
329994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
330094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
330194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
330294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
330394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
330494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
330594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
330694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
330794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
330894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
330994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
331094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
331194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
331294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+5];                        \
331394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
331494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
331594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
331694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
331794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
331894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
331994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
332094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
332194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
332294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
332394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
332494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
332594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
332694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
332794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
332894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t" /* arg2->r4 */                       \
332994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
333094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
333194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
333294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
333394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
333494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
333594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
333694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
333794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
333894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
333994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
334094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
334194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
334294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
334394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
334494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
334594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
334694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
334794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
334894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+6];                        \
334994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
335094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
335194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
335294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
335394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
335494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
335594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
335694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
335794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
335894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
335994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
336094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
336194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
336294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
336394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
336494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
336594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
336694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
336794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
336894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
336994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
337094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
337194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
337294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
337394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
337494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
337594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
337694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
337794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
337894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
337994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
338094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
338194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
338294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
338394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
338494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7)                            \
338594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
338694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
338794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+7];                        \
338894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
338994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
339094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
339194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
339294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
339394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
339494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
339594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
339694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
339794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
339894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
339994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
340094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
340194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
340294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
340394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
340494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
340594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
340694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
340794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
340894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
340994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
341094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
341194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
341294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
341394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
341494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
341594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
341694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
341794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
341894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
341994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
342094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
342194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
342294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
342394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
342494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
342594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8)                       \
342694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
342794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
342894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+8];                        \
342994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
343094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
343194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
343294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
343394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
343494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
343594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
343694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
343794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
343894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
343994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
344094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
344194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
344294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
344394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
344494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
344594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
344694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
344794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
344894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
344994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
345094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
345194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
345294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
345394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
345494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
345594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
345694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
345794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
345894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
345994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
346094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
346194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
346294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
346394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
346494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
346594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
346694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
346794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
346894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8,arg9)                  \
346994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
347094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
347194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+9];                        \
347294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
347394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
347494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
347594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
347694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
347794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
347894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
347994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
348094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
348194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
348294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
348394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
348494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
348594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
348694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
348794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
348894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
348994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
349094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(64)                        \
349194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
349294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,36(11)\n\t"                                       \
349394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,56(1)\n\t"                                        \
349494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
349594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
349694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
349794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
349894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
349994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
350094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
350194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
350294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
350394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
350494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
350594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
350694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
350794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
350894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(64)                                 \
350994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
351094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
351194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
351294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
351394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
351494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
351594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
351694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
351794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
351894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10)           \
351994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
352094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
352194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+10];                       \
352294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
352394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
352494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
352594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
352694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
352794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
352894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
352994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
353094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
353194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
353294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
353394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
353494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
353594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+10] = (unsigned long)arg10;                       \
353694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
353794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
353894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
353994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
354094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
354194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(64)                        \
354294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
354394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,40(11)\n\t"                                       \
354494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,60(1)\n\t"                                        \
354594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
354694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,36(11)\n\t"                                       \
354794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,56(1)\n\t"                                        \
354894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
354994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
355094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
355194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
355294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
355394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
355494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
355594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
355694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
355794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
355894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
355994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
356094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
356194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
356294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(64)                                 \
356394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
356494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
356594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
356694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
356794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
356894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
356994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
357094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
357194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
357294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10,arg11)     \
357394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
357494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
357594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+11];                       \
357694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
357794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
357894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
357994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
358094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
358194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
358294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
358394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
358494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
358594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
358694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
358794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
358894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
358994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+10] = (unsigned long)arg10;                       \
359094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+11] = (unsigned long)arg11;                       \
359194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
359294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
359394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
359494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
359594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
359694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(72)                        \
359794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg11 */                                              \
359894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,44(11)\n\t"                                       \
359994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,64(1)\n\t"                                        \
360094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
360194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,40(11)\n\t"                                       \
360294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,60(1)\n\t"                                        \
360394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
360494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,36(11)\n\t"                                       \
360594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,56(1)\n\t"                                        \
360694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
360794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
360894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
360994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
361094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
361194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
361294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
361394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
361494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
361594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
361694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
361794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
361894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
361994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
362094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(72)                                 \
362194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
362294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
362394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
362494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
362594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
362694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
362794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
362894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
362994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
363094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                arg7,arg8,arg9,arg10,arg11,arg12) \
363194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
363294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
363394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+12];                       \
363494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
363594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
363694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
363794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
363894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
363994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
364094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
364194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
364294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
364394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
364494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
364594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
364694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
364794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+10] = (unsigned long)arg10;                       \
364894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+11] = (unsigned long)arg11;                       \
364994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+12] = (unsigned long)arg12;                       \
365094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
365194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
365294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
365394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw  2,-8(11)\n\t"  /* save tocptr */                   \
365494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
365594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(72)                        \
365694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg12 */                                              \
365794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,48(11)\n\t"                                       \
365894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,68(1)\n\t"                                        \
365994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg11 */                                              \
366094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,44(11)\n\t"                                       \
366194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,64(1)\n\t"                                        \
366294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
366394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,40(11)\n\t"                                       \
366494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,60(1)\n\t"                                        \
366594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
366694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 3,36(11)\n\t"                                       \
366794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "stw 3,56(1)\n\t"                                        \
366894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
366994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
367094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
367194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
367294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
367394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
367494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
367594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
367694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
367794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
367894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
367994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
368094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
368194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
368294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(72)                                 \
368394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
368494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
368594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
368694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
368794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
368894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
368994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
369094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
369194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc32_aix5 */
369294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
369394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc64-aix5 ------------------------- */
369494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
369594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc64_aix5)
369694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
369794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
369894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
369994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */
370094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS                                       \
370194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "lr", "ctr", "xer",                                            \
370294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
370394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
370494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   "r11", "r12", "r13"
370594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
370694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Expand the stack frame, copying enough info that unwinding
370794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   still works.  Trashes r3. */
370894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
370994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr)                      \
371094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1,-" #_n_fr "\n\t"                               \
371194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3," #_n_fr "(1)\n\t"                               \
371294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  3,0(1)\n\t"
371394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
371494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_CONTRACT_FRAME_BY(_n_fr)                               \
371594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "addi 1,1," #_n_fr "\n\t"
371694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
371794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on ppc64-aix5, sizeof(unsigned
371894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   long) == 8. */
371994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
372094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig)                                   \
372194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
372294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
372394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+0];                        \
372494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
372594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
372694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1] = (unsigned long)_orig.r2;                       \
372794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2] = (unsigned long)_orig.nraddr;                   \
372894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
372994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
373094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
373194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
373294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
373394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
373494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
373594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
373694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
373794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
373894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
373994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
374094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
374194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
374294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
374394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
374494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
374594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
374694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1)                             \
374794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
374894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
374994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+1];                        \
375094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
375194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
375294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
375394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
375494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
375594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
375694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
375794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
375894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
375994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
376094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
376194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
376294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
376394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
376494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
376594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
376694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
376794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
376894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
376994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
377094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
377194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
377294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
377394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
377494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
377594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
377694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
377794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+2];                        \
377894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
377994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
378094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
378194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
378294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
378394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
378494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
378594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
378694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
378794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
378894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
378994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
379094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
379194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
379294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
379394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
379494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
379594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
379694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
379794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
379894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
379994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
380094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
380194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
380294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
380394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
380494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
380594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
380694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
380794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+3];                        \
380894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
380994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
381094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
381194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
381294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
381394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
381494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
381594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
381694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
381794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
381894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
381994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
382094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
382194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
382294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
382394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
382494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
382594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
382694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
382794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
382894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
382994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
383094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
383194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
383294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
383394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
383494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
383594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
383694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
383794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
383894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
383994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+4];                        \
384094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
384194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
384294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
384394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
384494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
384594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
384694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
384794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
384894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
384994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
385094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
385194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
385294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
385394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
385494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
385594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
385694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
385794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
385894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
385994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
386094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
386194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
386294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
386394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
386494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
386594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
386694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
386794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
386894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
386994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
387094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
387194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
387294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
387394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+5];                        \
387494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
387594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
387694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
387794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
387894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
387994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
388094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
388194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
388294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
388394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
388494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
388594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
388694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
388794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
388894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
388994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
389094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
389194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
389294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
389394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
389494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
389594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
389694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
389794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
389894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
389994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
390094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
390194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
390294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
390394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
390494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
390594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
390694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
390794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
390894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
390994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+6];                        \
391094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
391194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
391294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
391394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
391494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
391594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
391694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
391794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
391894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
391994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
392094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
392194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
392294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
392394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
392494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
392594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
392694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
392794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
392894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
392994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
393094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
393194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
393294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
393394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
393494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
393594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
393694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
393794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
393894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
393994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
394094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
394194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
394294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
394394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
394494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
394594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7)                            \
394694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
394794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
394894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+7];                        \
394994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
395094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
395194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
395294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
395394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
395494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
395594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
395694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
395794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
395894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
395994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
396094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
396194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
396294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
396394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
396494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
396594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
396694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
396794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
396894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
396994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
397094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
397194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
397294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
397394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
397494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
397594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
397694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
397794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
397894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
397994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
398094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
398194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
398294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
398394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
398494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
398594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
398694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8)                       \
398794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
398894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
398994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+8];                        \
399094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
399194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
399294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
399394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
399494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
399594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
399694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
399794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
399894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
399994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
400094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
400194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
400294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
400394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
400494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
400594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
400694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
400794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
400894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
400994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
401094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
401194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
401294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
401394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
401494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
401594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
401694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
401794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
401894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
401994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
402094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
402194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
402294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
402394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
402494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
402594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
402694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
402794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
402894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
402994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                 arg7,arg8,arg9)                  \
403094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
403194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
403294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+9];                        \
403394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
403494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
403594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
403694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
403794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
403894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
403994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
404094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
404194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
404294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
404394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
404494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
404594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
404694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
404794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
404894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
404994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
405094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
405194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(128)                       \
405294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
405394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,72(11)\n\t"                                       \
405494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,112(1)\n\t"                                       \
405594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
405694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
405794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
405894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
405994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
406094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
406194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
406294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
406394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
406494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
406594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
406694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
406794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
406894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
406994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(128)                                \
407094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
407194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
407294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
407394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
407494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
407594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
407694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
407794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
407894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
407994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10)           \
408094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
408194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
408294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+10];                       \
408394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
408494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
408594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
408694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
408794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
408894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
408994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
409094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
409194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
409294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
409394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
409494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
409594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
409694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+10] = (unsigned long)arg10;                       \
409794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
409894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
409994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
410094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
410194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
410294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(128)                       \
410394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
410494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,80(11)\n\t"                                       \
410594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,120(1)\n\t"                                       \
410694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
410794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,72(11)\n\t"                                       \
410894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,112(1)\n\t"                                       \
410994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
411094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
411194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
411294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
411394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
411494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
411594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
411694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
411794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
411894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
411994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
412094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
412194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
412294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
412394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(128)                                \
412494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
412594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
412694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
412794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
412894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
412994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
413094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
413194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
413294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
413394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                  arg7,arg8,arg9,arg10,arg11)     \
413494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
413594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
413694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+11];                       \
413794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
413894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
413994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
414094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
414194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
414294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
414394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
414494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
414594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
414694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
414794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
414894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
414994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
415094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+10] = (unsigned long)arg10;                       \
415194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+11] = (unsigned long)arg11;                       \
415294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
415394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
415494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
415594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
415694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
415794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(144)                       \
415894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg11 */                                              \
415994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,88(11)\n\t"                                       \
416094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,128(1)\n\t"                                       \
416194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
416294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,80(11)\n\t"                                       \
416394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,120(1)\n\t"                                       \
416494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
416594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,72(11)\n\t"                                       \
416694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,112(1)\n\t"                                       \
416794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
416894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
416994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
417094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
417194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
417294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
417394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
417494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
417594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
417694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
417794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
417894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
417994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
418094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
418194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(144)                                \
418294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
418394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
418494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
418594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
418694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
418794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
418894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
418994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
419094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
419194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                arg7,arg8,arg9,arg10,arg11,arg12) \
419294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   do {                                                           \
419394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile OrigFn        _orig = (orig);                      \
419494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _argvec[3+12];                       \
419594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      volatile unsigned long _res;                                \
419694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      /* _argvec[0] holds current r2 across the call */           \
419794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[1]   = (unsigned long)_orig.r2;                     \
419894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
419994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+1] = (unsigned long)arg1;                         \
420094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+2] = (unsigned long)arg2;                         \
420194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+3] = (unsigned long)arg3;                         \
420294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+4] = (unsigned long)arg4;                         \
420394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+5] = (unsigned long)arg5;                         \
420494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+6] = (unsigned long)arg6;                         \
420594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+7] = (unsigned long)arg7;                         \
420694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+8] = (unsigned long)arg8;                         \
420794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+9] = (unsigned long)arg9;                         \
420894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+10] = (unsigned long)arg10;                       \
420994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+11] = (unsigned long)arg11;                       \
421094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      _argvec[2+12] = (unsigned long)arg12;                       \
421194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      __asm__ volatile(                                           \
421294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
421394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
421494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std  2,-16(11)\n\t" /* save tocptr */                   \
421594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
421694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_EXPAND_FRAME_BY_trashes_r3(144)                       \
421794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg12 */                                              \
421894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,96(11)\n\t"                                       \
421994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,136(1)\n\t"                                       \
422094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg11 */                                              \
422194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,88(11)\n\t"                                       \
422294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,128(1)\n\t"                                       \
422394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg10 */                                              \
422494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,80(11)\n\t"                                       \
422594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,120(1)\n\t"                                       \
422694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* arg9 */                                               \
422794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  3,72(11)\n\t"                                       \
422894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "std 3,112(1)\n\t"                                       \
422994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         /* args1-8 */                                            \
423094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
423194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
423294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
423394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
423494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
423594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
423694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
423794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
423894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
423994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
424094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr 11,%1\n\t"                                           \
424194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "mr %0,3\n\t"                                            \
424294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         "ld  2,-16(11)\n\t" /* restore tocptr */                 \
424394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(144)                                \
424494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         VG_CONTRACT_FRAME_BY(512)                                \
424594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*out*/   "=r" (_res)                                  \
424694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*in*/    "r" (&_argvec[2])                            \
424794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
424894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      );                                                          \
424994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez      lval = (__typeof__(lval)) _res;                             \
425094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } while (0)
425194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
425294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc64_aix5 */
425394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
425494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
425594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */
425694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS.               */
425794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/*                                                                    */
425894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */
425994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
426094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Some request codes.  There are many more of these, but most are not
426194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   exposed to end-user view.  These are the public ones, all of the
426294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   form 0x1000 + small_number.
426394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
426494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Core ones are in the range 0x00000000--0x0000ffff.  The non-public
426594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ones start at 0x2000.
426694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
426794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
426894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These macros are used by tools -- they must be public, but don't
426994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   embed them into other programs. */
427094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_USERREQ_TOOL_BASE(a,b) \
427194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
427294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_IS_TOOL_USERREQ(a, b, v) \
427394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
427494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
427594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
427694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   This enum comprises an ABI exported by Valgrind to programs
427794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   which use client requests.  DO NOT CHANGE THE ORDER OF THESE
427894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ENTRIES, NOR DELETE ANY -- add new ones at the end. */
427994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef
428094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   enum { VG_USERREQ__RUNNING_ON_VALGRIND  = 0x1001,
428194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
428294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
428394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* These allow any function to be called from the simulated
428494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             CPU but run on the real CPU.  Nb: the first arg passed to
428594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             the function is always the ThreadId of the running
428694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             thread!  So CLIENT_CALL0 actually requires a 1 arg
428794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             function, etc. */
428894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__CLIENT_CALL0 = 0x1101,
428994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__CLIENT_CALL1 = 0x1102,
429094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__CLIENT_CALL2 = 0x1103,
429194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__CLIENT_CALL3 = 0x1104,
429294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
429394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* Can be useful in regression testing suites -- eg. can
429494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             send Valgrind's output to /dev/null and still count
429594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             errors. */
429694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__COUNT_ERRORS = 0x1201,
429794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
429894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* These are useful and can be interpreted by any tool that
429994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             tracks malloc() et al, by using vg_replace_malloc.c. */
430094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
430194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__FREELIKE_BLOCK   = 0x1302,
430294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* Memory pool support. */
430394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__CREATE_MEMPOOL   = 0x1303,
430494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__DESTROY_MEMPOOL  = 0x1304,
430594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__MEMPOOL_ALLOC    = 0x1305,
430694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__MEMPOOL_FREE     = 0x1306,
430794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__MEMPOOL_TRIM     = 0x1307,
430894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__MOVE_MEMPOOL     = 0x1308,
430994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__MEMPOOL_CHANGE   = 0x1309,
431094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__MEMPOOL_EXISTS   = 0x130a,
431194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
431294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* Allow printfs to valgrind log. */
431394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* The first two pass the va_list argument by value, which
431494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             assumes it is the same size as or smaller than a UWord,
431594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             which generally isn't the case.  Hence are deprecated.
431694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             The second two pass the vargs by reference and so are
431794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez             immune to this problem. */
431894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* both :: char* fmt, va_list vargs (DEPRECATED) */
431994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__PRINTF           = 0x1401,
432094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
432194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* both :: char* fmt, va_list* vargs */
432294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403,
432394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404,
432494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
432594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* Stack support. */
432694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__STACK_REGISTER   = 0x1501,
432794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__STACK_DEREGISTER = 0x1502,
432894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__STACK_CHANGE     = 0x1503,
432994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
433094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* Wine support */
433194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601,
433294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
433394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          /* Querying of debug info. */
433494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez          VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701
433594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   } Vg_ClientRequest;
433694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
433794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if !defined(__GNUC__)
433894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define __extension__ /* */
433994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
434094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
434194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
434294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/*
434394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind
434494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez * client request and whose value equals the client request result.
434594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez */
434694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
434794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(NVALGRIND)
434894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
434994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                               \
435094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_default, _zzq_request,                                    \
435194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)         \
435294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   (_zzq_default)
435394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
435494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else /*defined(NVALGRIND)*/
435594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
435694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER)
435794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
435894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                                \
435994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_default, _zzq_request,                                     \
436094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)          \
436194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   (vg_VALGRIND_DO_CLIENT_REQUEST_EXPR((uintptr_t)(_zzq_default),       \
436294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        (_zzq_request), (uintptr_t)(_zzq_arg1), (uintptr_t)(_zzq_arg2), \
436394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        (uintptr_t)(_zzq_arg3), (uintptr_t)(_zzq_arg4),                 \
436494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        (uintptr_t)(_zzq_arg5)))
436594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
436694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic __inline unsigned
436794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvg_VALGRIND_DO_CLIENT_REQUEST_EXPR(uintptr_t _zzq_default,
436894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                   unsigned _zzq_request, uintptr_t _zzq_arg1,
436994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                   uintptr_t _zzq_arg2, uintptr_t _zzq_arg3,
437094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                   uintptr_t _zzq_arg4, uintptr_t _zzq_arg5)
437194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez{
437294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    unsigned _zzq_rlval;
437394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, _zzq_request,
437494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                      _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5);
437594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    return _zzq_rlval;
437694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
437794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
437894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else /*defined(_MSC_VER)*/
437994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
438094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                               \
438194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_default, _zzq_request,                                    \
438294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)         \
438394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   (__extension__({unsigned int _zzq_rlval;                            \
438494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, _zzq_request, \
438594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
438694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _zzq_rlval;                                                        \
438794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }))
438894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
438994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /*defined(_MSC_VER)*/
439094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
439194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /*defined(NVALGRIND)*/
439294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
439394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
439494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Returns the number of Valgrinds this code is running under.  That
439594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   is, 0 if running natively, 1 if running under Valgrind, 2 if
439694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   running under Valgrind which is running under another Valgrind,
439794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   etc. */
439894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define RUNNING_ON_VALGRIND                                           \
439994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */,                   \
440094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                    VG_USERREQ__RUNNING_ON_VALGRIND,  \
440194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                                    0, 0, 0, 0, 0)                    \
440294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
440394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
440494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
440594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   _qzz_len - 1].  Useful if you are debugging a JITter or some such,
440694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   since it provides a way to make sure valgrind will retranslate the
440794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   invalidated area.  Returns no value. */
440894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len)         \
440994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
441094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
441194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__DISCARD_TRANSLATIONS,  \
441294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               _qzz_addr, _qzz_len, 0, 0, 0);     \
441394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
441494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
441594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
441694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These requests are for getting Valgrind itself to print something.
441794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Possibly with a backtrace.  This is a really ugly hack.  The return value
441894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   is the number of characters printed, excluding the "**<pid>** " part at the
441994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   start and the backtrace (if present). */
442094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
442194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(NVALGRIND)
442294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
442394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define VALGRIND_PRINTF(...)
442494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#  define VALGRIND_PRINTF_BACKTRACE(...)
442594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
442694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else /* NVALGRIND */
442794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
442894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if !defined(_MSC_VER)
442994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Modern GCC will optimize the static routine out if unused,
443094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   and unused attribute will shut down warnings about it.  */
443194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic int VALGRIND_PRINTF(const char *format, ...)
443294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __attribute__((format(__printf__, 1, 2), __unused__));
443394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
443494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic int
443594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER)
443694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez__inline
443794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
443894ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezVALGRIND_PRINTF(const char *format, ...)
443994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez{
444094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   unsigned long _qzz_res;
444194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   va_list vargs;
444294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   va_start(vargs, format);
444394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER)
444494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,
444594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              VG_USERREQ__PRINTF_VALIST_BY_REF,
444694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              (uintptr_t)format,
444794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              (uintptr_t)&vargs,
444894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              0, 0, 0);
444994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else
445094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,
445194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              VG_USERREQ__PRINTF_VALIST_BY_REF,
445294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              (unsigned long)format,
445394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              (unsigned long)&vargs,
445494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              0, 0, 0);
445594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
445694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   va_end(vargs);
445794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   return (int)_qzz_res;
445894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
445994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
446094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if !defined(_MSC_VER)
446194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
446294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __attribute__((format(__printf__, 1, 2), __unused__));
446394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
446494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic int
446594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER)
446694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez__inline
446794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
446894ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezVALGRIND_PRINTF_BACKTRACE(const char *format, ...)
446994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez{
447094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   unsigned long _qzz_res;
447194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   va_list vargs;
447294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   va_start(vargs, format);
447394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER)
447494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,
447594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
447694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              (uintptr_t)format,
447794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              (uintptr_t)&vargs,
447894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              0, 0, 0);
447994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else
448094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,
448194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
448294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              (unsigned long)format,
448394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              (unsigned long)&vargs,
448494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                              0, 0, 0);
448594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
448694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   va_end(vargs);
448794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   return (int)_qzz_res;
448894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}
448994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
449094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* NVALGRIND */
449194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
449294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
449394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These requests allow control to move from the simulated CPU to the
449494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   real CPU, calling an arbitary function.
449594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
449694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Note that the current ThreadId is inserted as the first argument.
449794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   So this call:
449894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
449994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez     VALGRIND_NON_SIMD_CALL2(f, arg1, arg2)
450094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
450194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   requires f to have this signature:
450294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
450394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez     Word f(Word tid, Word arg1, Word arg2)
450494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
450594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   where "Word" is a word-sized type.
450694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
450794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Note that these client requests are not entirely reliable.  For example,
450894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   if you call a function with them that subsequently calls printf(),
450994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   there's a high chance Valgrind will crash.  Generally, your prospects of
451094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   these working are made higher if the called function does not refer to
451194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   any global variables, and does not refer to any libc or other functions
451294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   (printf et al).  Any kind of entanglement with libc or dynamic linking is
451394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   likely to have a bad outcome, for tricky reasons which we've grappled
451494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   with a lot in the past.
451594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
451694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_NON_SIMD_CALL0(_qyy_fn)                          \
451794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __extension__                                                  \
451894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ({unsigned long _qyy_res;                                      \
451994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
452094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__CLIENT_CALL0,          \
452194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               _qyy_fn,                           \
452294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               0, 0, 0, 0);                       \
452394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _qyy_res;                                                     \
452494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   })
452594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
452694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1)               \
452794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __extension__                                                  \
452894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ({unsigned long _qyy_res;                                      \
452994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
453094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__CLIENT_CALL1,          \
453194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               _qyy_fn,                           \
453294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               _qyy_arg1, 0, 0, 0);               \
453394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _qyy_res;                                                     \
453494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   })
453594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
453694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2)    \
453794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __extension__                                                  \
453894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ({unsigned long _qyy_res;                                      \
453994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
454094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__CLIENT_CALL2,          \
454194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               _qyy_fn,                           \
454294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               _qyy_arg1, _qyy_arg2, 0, 0);       \
454394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _qyy_res;                                                     \
454494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   })
454594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
454694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
454794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __extension__                                                  \
454894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ({unsigned long _qyy_res;                                      \
454994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
455094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__CLIENT_CALL3,          \
455194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               _qyy_fn,                           \
455294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               _qyy_arg1, _qyy_arg2,              \
455394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               _qyy_arg3, 0);                     \
455494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _qyy_res;                                                     \
455594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   })
455694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
455794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
455894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Counts the number of errors that have been recorded by a tool.  Nb:
455994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   the tool must record the errors with VG_(maybe_record_error)() or
456094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VG_(unique_error)() for them to be counted. */
456194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_COUNT_ERRORS                                     \
456294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __extension__                                                  \
456394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ({unsigned int _qyy_res;                                       \
456494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
456594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__COUNT_ERRORS,          \
456694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               0, 0, 0, 0, 0);                    \
456794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _qyy_res;                                                     \
456894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   })
456994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
457094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing
457194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   when heap blocks are allocated in order to give accurate results.  This
457294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   happens automatically for the standard allocator functions such as
457394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete,
457494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   delete[], etc.
457594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
457694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   But if your program uses a custom allocator, this doesn't automatically
457794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   happen, and Valgrind will not do as well.  For example, if you allocate
457894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   superblocks with mmap() and then allocates chunks of the superblocks, all
457994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Valgrind's observations will be at the mmap() level and it won't know that
458094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   the chunks should be considered separate entities.  In Memcheck's case,
458194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   that means you probably won't get heap block overrun detection (because
458294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   there won't be redzones marked as unaddressable) and you definitely won't
458394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   get any leak detection.
458494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
458594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   The following client requests allow a custom allocator to be annotated so
458694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   that it can be handled accurately by Valgrind.
458794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
458894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated
458994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   by a malloc()-like function.  For Memcheck (an illustrative case), this
459094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   does two things:
459194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
459294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   - It records that the block has been allocated.  This means any addresses
459394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez     within the block mentioned in error messages will be
459494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez     identified as belonging to the block.  It also means that if the block
459594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez     isn't freed it will be detected by the leak checker.
459694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
459794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   - It marks the block as being addressable and undefined (if 'is_zeroed' is
459894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez     not set), or addressable and defined (if 'is_zeroed' is set).  This
459994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez     controls how accesses to the block by the program are handled.
460094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
460194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   'addr' is the start of the usable block (ie. after any
460294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   redzone), 'sizeB' is its size.  'rzB' is the redzone size if the allocator
460394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   can apply redzones -- these are blocks of padding at the start and end of
460494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   each block.  Adding redzones is recommended as it makes it much more likely
460594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Valgrind will spot block overruns.  `is_zeroed' indicates if the memory is
460694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   zeroed (or filled with another predictable value), as is the case for
460794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   calloc().
460894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
460994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a
461094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   heap block -- that will be used by the client program -- is allocated.
461194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   It's best to put it at the outermost level of the allocator if possible;
461294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   for example, if you have a function my_alloc() which calls
461394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   internal_alloc(), and the client request is put inside internal_alloc(),
461494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   stack traces relating to the heap block will contain entries for both
461594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   my_alloc() and internal_alloc(), which is probably not what you want.
461694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
461794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out
461894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   custom blocks from within a heap block, B, that has been allocated with
461994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   malloc/calloc/new/etc, then block B will be *ignored* during leak-checking
462094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   -- the custom blocks will take precedence.
462194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
462294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK.  For
462394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Memcheck, it does two things:
462494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
462594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   - It records that the block has been deallocated.  This assumes that the
462694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez     block was annotated as having been allocated via
462794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez     VALGRIND_MALLOCLIKE_BLOCK.  Otherwise, an error will be issued.
462894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
462994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   - It marks the block as being unaddressable.
463094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
463194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a
463294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   heap block is deallocated.
463394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
463494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   In many cases, these two client requests will not be enough to get your
463594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   allocator working well with Memcheck.  More specifically, if your allocator
463694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call
463794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   will be necessary to mark the memory as addressable just before the zeroing
463894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   occurs, otherwise you'll get a lot of invalid write errors.  For example,
463994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   you'll need to do this if your allocator recycles freed blocks, but it
464094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK).
464194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Alternatively, if your allocator reuses freed blocks for allocator-internal
464294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary.
464394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
464494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Really, what's happening is a blurring of the lines between the client
464594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the
464694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   memory should be considered unaddressable to the client program, but the
464794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   allocator knows more than the rest of the client program and so may be able
464894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   to safely access it.  Extra client requests are necessary for Valgrind to
464994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   understand the distinction between the allocator and the rest of the
465094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   program.
465194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
465294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Note: there is currently no VALGRIND_REALLOCLIKE_BLOCK client request;  it
465394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   has to be emulated with MALLOCLIKE/FREELIKE and memory copying.
465494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
465594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Ignored if addr == 0.
465694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
465794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)    \
465894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
465994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
466094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__MALLOCLIKE_BLOCK,      \
466194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               addr, sizeB, rzB, is_zeroed, 0);   \
466294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
466394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
466494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
466594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   Ignored if addr == 0.
466694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/
466794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_FREELIKE_BLOCK(addr, rzB)                        \
466894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
466994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
467094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__FREELIKE_BLOCK,        \
467194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               addr, rzB, 0, 0, 0);               \
467294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
467394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
467494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Create a memory pool. */
467594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed)             \
467694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
467794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
467894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__CREATE_MEMPOOL,        \
467994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               pool, rzB, is_zeroed, 0, 0);       \
468094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
468194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
468294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Destroy a memory pool. */
468394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DESTROY_MEMPOOL(pool)                            \
468494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
468594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
468694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__DESTROY_MEMPOOL,       \
468794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               pool, 0, 0, 0, 0);                 \
468894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
468994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
469094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Associate a piece of memory with a memory pool. */
469194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size)                  \
469294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
469394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
469494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__MEMPOOL_ALLOC,         \
469594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               pool, addr, size, 0, 0);           \
469694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
469794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
469894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Disassociate a piece of memory from a memory pool. */
469994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_FREE(pool, addr)                         \
470094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
470194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
470294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__MEMPOOL_FREE,          \
470394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               pool, addr, 0, 0, 0);              \
470494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
470594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
470694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Disassociate any pieces outside a particular range. */
470794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_TRIM(pool, addr, size)                   \
470894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
470994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
471094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__MEMPOOL_TRIM,          \
471194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               pool, addr, size, 0, 0);           \
471294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
471394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
471494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Resize and/or move a piece associated with a memory pool. */
471594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MOVE_MEMPOOL(poolA, poolB)                       \
471694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
471794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
471894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__MOVE_MEMPOOL,          \
471994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               poolA, poolB, 0, 0, 0);            \
472094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
472194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
472294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Resize and/or move a piece associated with a memory pool. */
472394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size)         \
472494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
472594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
472694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__MEMPOOL_CHANGE,        \
472794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               pool, addrA, addrB, size, 0);      \
472894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
472994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
473094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Return 1 if a mempool exists, else 0. */
473194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_EXISTS(pool)                             \
473294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __extension__                                                  \
473394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ({unsigned int _qzz_res;                                       \
473494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
473594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__MEMPOOL_EXISTS,        \
473694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               pool, 0, 0, 0, 0);                 \
473794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _qzz_res;                                                     \
473894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   })
473994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
474094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Mark a piece of memory as being a stack. Returns a stack id. */
474194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_STACK_REGISTER(start, end)                       \
474294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   __extension__                                                  \
474394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   ({unsigned int _qzz_res;                                       \
474494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
474594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__STACK_REGISTER,        \
474694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               start, end, 0, 0, 0);              \
474794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    _qzz_res;                                                     \
474894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   })
474994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
475094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Unmark the piece of memory associated with a stack id as being a
475194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   stack. */
475294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_STACK_DEREGISTER(id)                             \
475394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
475494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
475594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__STACK_DEREGISTER,      \
475694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               id, 0, 0, 0, 0);                   \
475794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
475894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
475994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Change the start and end address of the stack id. */
476094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_STACK_CHANGE(id, start, end)                     \
476194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
476294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
476394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__STACK_CHANGE,          \
476494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               id, start, end, 0, 0);             \
476594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
476694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
476794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Load PDB debug info for Wine PE image_map. */
476894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta)   \
476994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
477094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
477194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__LOAD_PDB_DEBUGINFO,    \
477294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               fd, ptr, total_size, delta, 0);    \
477394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
477494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
477594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Map a code address to a source file name and line number.  buf64
477694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   must point to a 64-byte buffer in the caller's address space.  The
477794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   result will be dumped in there and is guaranteed to be zero
477894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   terminated.  If no info is found, the first byte is set to zero. */
477994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64)                    \
478094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   {unsigned int _qzz_res;                                        \
478194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
478294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               VG_USERREQ__MAP_IP_TO_SRCLOC,      \
478394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez                               addr, buf64, 0, 0, 0);             \
478494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez   }
478594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
478694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
478794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_x86_linux
478894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_amd64_linux
478994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc32_linux
479094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc64_linux
479194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_arm_linux
479294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc32_aix5
479394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc64_aix5
479494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
479594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif   /* __VALGRIND_H */
479694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
479794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif
4798