valgrind.h revision aaaf21d21f5803b6b1a0fc558bb8db0fcb83a7a0
1b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj/* -*- c -*-
2e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   ----------------------------------------------------------------
3e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
4e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   Notice that the following BSD-style license applies to this one
57fd15d674f18757167305947732057099e175914njn   file (valgrind.h) only.  The rest of Valgrind is licensed under the
67fd15d674f18757167305947732057099e175914njn   terms of the GNU General Public License, version 2, unless
77fd15d674f18757167305947732057099e175914njn   otherwise indicated.  See the COPYING file in the source
87fd15d674f18757167305947732057099e175914njn   distribution for details.
9e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
10e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   ----------------------------------------------------------------
11e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
12b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn   This file is part of Valgrind, a dynamic binary instrumentation
13b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn   framework.
14de4a1d01951937632098a6cda45859afa587a06fsewardj
1503f8d3fc25f5a45c5826259d1b33b7f310117279sewardj   Copyright (C) 2000-2012 Julian Seward.  All rights reserved.
16e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
17e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   Redistribution and use in source and binary forms, with or without
18e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   modification, are permitted provided that the following conditions
19e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   are met:
20e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
21e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   1. Redistributions of source code must retain the above copyright
22e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn      notice, this list of conditions and the following disclaimer.
23e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
24e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   2. The origin of this software must not be misrepresented; you must
25e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn      not claim that you wrote the original software.  If you use this
26e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn      software in a product, an acknowledgment in the product
27e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn      documentation would be appreciated but is not required.
28de4a1d01951937632098a6cda45859afa587a06fsewardj
29e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   3. Altered source versions must be plainly marked as such, and must
30e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn      not be misrepresented as being the original software.
31de4a1d01951937632098a6cda45859afa587a06fsewardj
32e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   4. The name of the author may not be used to endorse or promote
33e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn      products derived from this software without specific prior written
34e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn      permission.
35de4a1d01951937632098a6cda45859afa587a06fsewardj
36e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
37e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
38e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
40e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
42e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
43e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
44e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47de4a1d01951937632098a6cda45859afa587a06fsewardj
48e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   ----------------------------------------------------------------
49e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
50e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   Notice that the above BSD-style license applies to this one file
51e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   (valgrind.h) only.  The entire rest of Valgrind is licensed under
52e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   the terms of the GNU General Public License, version 2.  See the
53e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   COPYING file in the source distribution for details.
54e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
55e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   ----------------------------------------------------------------
56de4a1d01951937632098a6cda45859afa587a06fsewardj*/
57de4a1d01951937632098a6cda45859afa587a06fsewardj
58de4a1d01951937632098a6cda45859afa587a06fsewardj
5930d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn/* This file is for inclusion into client (your!) code.
6030d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn
6130d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn   You can use these macros to manipulate and query Valgrind's
6230d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn   execution inside your own programs.
6330d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn
6430d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn   The resulting executables will still run without Valgrind, just a
6530d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn   little bit more slowly than they otherwise would, but otherwise
6630d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn   unchanged.  When not running on valgrind, each client request
670ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   consumes very few (eg. 7) instructions, so the resulting performance
6830d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn   loss is negligible unless you plan to execute client requests
6930d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn   millions of times per second.  Nevertheless, if that is still a
7030d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn   problem, you can compile with the NVALGRIND symbol defined (gcc
7130d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn   -DNVALGRIND) so that client requests are not even compiled in.  */
7230d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn
73de4a1d01951937632098a6cda45859afa587a06fsewardj#ifndef __VALGRIND_H
74de4a1d01951937632098a6cda45859afa587a06fsewardj#define __VALGRIND_H
75de4a1d01951937632098a6cda45859afa587a06fsewardj
767104416748e90239b97560f5d727da107e3e08a9sewardj
777104416748e90239b97560f5d727da107e3e08a9sewardj/* ------------------------------------------------------------------ */
787104416748e90239b97560f5d727da107e3e08a9sewardj/* VERSION NUMBER OF VALGRIND                                         */
797104416748e90239b97560f5d727da107e3e08a9sewardj/* ------------------------------------------------------------------ */
807104416748e90239b97560f5d727da107e3e08a9sewardj
817104416748e90239b97560f5d727da107e3e08a9sewardj/* Specify Valgrind's version number, so that user code can
820fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj   conditionally compile based on our version number.  Note that these
830fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj   were introduced at version 3.6 and so do not exist in version 3.5
840fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj   or earlier.  The recommended way to use them to check for "version
850fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj   X.Y or later" is (eg)
860fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj
870fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj#if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__)   \
880fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj    && (__VALGRIND_MAJOR__ > 3                                   \
890fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj        || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6))
900fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj*/
910fe1d4c134ba889ff5e0a3b1b4dc8f36e610ca97sewardj#define __VALGRIND_MAJOR__    3
927d79e0b97af18baed7ab6b12a363538974d3775asewardj#define __VALGRIND_MINOR__    8
937104416748e90239b97560f5d727da107e3e08a9sewardj
947104416748e90239b97560f5d727da107e3e08a9sewardj
9539de4b473801ab10a48e356cddc863212dd28cd1fitzhardinge#include <stdarg.h>
9639de4b473801ab10a48e356cddc863212dd28cd1fitzhardinge
973dd0a912e48a4884ee51ab3afe41856c165185canjn/* Nb: this file might be included in a file compiled with -ansi.  So
983dd0a912e48a4884ee51ab3afe41856c165185canjn   we can't use C++ style "//" comments nor the "asm" keyword (instead
993dd0a912e48a4884ee51ab3afe41856c165185canjn   use "__asm__"). */
1003dd0a912e48a4884ee51ab3afe41856c165185canjn
101f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj/* Derive some tags indicating what the target platform is.  Note
1020ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   that in this file we're using the compiler's CPP symbols for
1030ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   identifying architectures, which are different to the ones we use
1040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   within the rest of Valgrind.  Note, __powerpc__ is active for both
1050ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   32 and 64-bit PPC, whereas __powerpc64__ is only active for the
10659570ffbe31930ab4d678754daaeec0715117a3dsewardj   latter (on Linux, that is).
10759570ffbe31930ab4d678754daaeec0715117a3dsewardj
10859570ffbe31930ab4d678754daaeec0715117a3dsewardj   Misc note: how to find out what's predefined in gcc by default:
10959570ffbe31930ab4d678754daaeec0715117a3dsewardj   gcc -Wp,-dM somefile.c
11059570ffbe31930ab4d678754daaeec0715117a3dsewardj*/
1117af3230a91de23a737946c1b4649b2f826672bf6sewardj#undef PLAT_x86_darwin
1127af3230a91de23a737946c1b4649b2f826672bf6sewardj#undef PLAT_amd64_darwin
1137f489813d200fb614a0856fca05e2f9ebf66dd48bart#undef PLAT_x86_win32
114aaaf21d21f5803b6b1a0fc558bb8db0fcb83a7a0bart#undef PLAT_amd64_win64
115f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#undef PLAT_x86_linux
116f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#undef PLAT_amd64_linux
117f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#undef PLAT_ppc32_linux
118f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#undef PLAT_ppc64_linux
11959570ffbe31930ab4d678754daaeec0715117a3dsewardj#undef PLAT_arm_linux
120b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#undef PLAT_s390x_linux
1215db15403e889d4db339b342bc2a824ef0bfaa654sewardj#undef PLAT_mips32_linux
1224df0bfc0614379192c780c944415dc420d9cfe8epetarj#undef PLAT_mips64_linux
123b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
124f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj
1256e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj#if defined(__APPLE__) && defined(__i386__)
126f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#  define PLAT_x86_darwin 1
127f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#elif defined(__APPLE__) && defined(__x86_64__)
128f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#  define PLAT_amd64_darwin 1
1296e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj#elif defined(__MINGW32__) || defined(__CYGWIN32__) \
1306e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj      || (defined(_WIN32) && defined(_M_IX86))
1317f489813d200fb614a0856fca05e2f9ebf66dd48bart#  define PLAT_x86_win32 1
132aaaf21d21f5803b6b1a0fc558bb8db0fcb83a7a0bart#elif defined(__MINGW64__) || (defined(_WIN64) && defined(_M_X64))
133aaaf21d21f5803b6b1a0fc558bb8db0fcb83a7a0bart#  define PLAT_amd64_win64 1
13459570ffbe31930ab4d678754daaeec0715117a3dsewardj#elif defined(__linux__) && defined(__i386__)
135f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#  define PLAT_x86_linux 1
13659570ffbe31930ab4d678754daaeec0715117a3dsewardj#elif defined(__linux__) && defined(__x86_64__)
137f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#  define PLAT_amd64_linux 1
13859570ffbe31930ab4d678754daaeec0715117a3dsewardj#elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
139f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#  define PLAT_ppc32_linux 1
14059570ffbe31930ab4d678754daaeec0715117a3dsewardj#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__)
141f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#  define PLAT_ppc64_linux 1
14259570ffbe31930ab4d678754daaeec0715117a3dsewardj#elif defined(__linux__) && defined(__arm__)
14359570ffbe31930ab4d678754daaeec0715117a3dsewardj#  define PLAT_arm_linux 1
144b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#elif defined(__linux__) && defined(__s390__) && defined(__s390x__)
145b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#  define PLAT_s390x_linux 1
1465db15403e889d4db339b342bc2a824ef0bfaa654sewardj#elif defined(__linux__) && defined(__mips__)
1474df0bfc0614379192c780c944415dc420d9cfe8epetarj#if (__mips==64)
1484df0bfc0614379192c780c944415dc420d9cfe8epetarj#  define PLAT_mips64_linux 1
1494df0bfc0614379192c780c944415dc420d9cfe8epetarj#else
1505db15403e889d4db339b342bc2a824ef0bfaa654sewardj#  define PLAT_mips32_linux 1
1514df0bfc0614379192c780c944415dc420d9cfe8epetarj#endif
152f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#else
153f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj/* If we're not compiling for our target platform, don't generate
1540ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   any inline asms.  */
1550ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#  if !defined(NVALGRIND)
1560ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#    define NVALGRIND 1
1570ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#  endif
158b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj#endif
159b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj
1600ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
16130d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn/* ------------------------------------------------------------------ */
1620ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS.  There is nothing */
1630ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* in here of use to end-users -- skip to the next section.           */
16430d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn/* ------------------------------------------------------------------ */
165de4a1d01951937632098a6cda45859afa587a06fsewardj
166575ce8ef8fa86a502dabe152293320676922dcfebart/*
167575ce8ef8fa86a502dabe152293320676922dcfebart * VALGRIND_DO_CLIENT_REQUEST(): a statement that invokes a Valgrind client
168575ce8ef8fa86a502dabe152293320676922dcfebart * request. Accepts both pointers and integers as arguments.
169575ce8ef8fa86a502dabe152293320676922dcfebart *
1704b3a74204894e943c43cb8e8aae39d813040702csewardj * VALGRIND_DO_CLIENT_REQUEST_STMT(): a statement that invokes a Valgrind
1714b3a74204894e943c43cb8e8aae39d813040702csewardj * client request that does not return a value.
1724b3a74204894e943c43cb8e8aae39d813040702csewardj
173575ce8ef8fa86a502dabe152293320676922dcfebart * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind
1744b3a74204894e943c43cb8e8aae39d813040702csewardj * client request and whose value equals the client request result.  Accepts
1754b3a74204894e943c43cb8e8aae39d813040702csewardj * both pointers and integers as arguments.  Note that such calls are not
1764b3a74204894e943c43cb8e8aae39d813040702csewardj * necessarily pure functions -- they may have side effects.
177575ce8ef8fa86a502dabe152293320676922dcfebart */
178575ce8ef8fa86a502dabe152293320676922dcfebart
179575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default,            \
180575ce8ef8fa86a502dabe152293320676922dcfebart                                   _zzq_request, _zzq_arg1, _zzq_arg2,  \
181575ce8ef8fa86a502dabe152293320676922dcfebart                                   _zzq_arg3, _zzq_arg4, _zzq_arg5)     \
18217dfe1addc98de357b9e24ddbe4ad7df4454873aflorian  do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default),   \
183575ce8ef8fa86a502dabe152293320676922dcfebart                        (_zzq_request), (_zzq_arg1), (_zzq_arg2),       \
18417dfe1addc98de357b9e24ddbe4ad7df4454873aflorian                        (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
185575ce8ef8fa86a502dabe152293320676922dcfebart
1864b3a74204894e943c43cb8e8aae39d813040702csewardj#define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1,        \
1874b3a74204894e943c43cb8e8aae39d813040702csewardj                           _zzq_arg2,  _zzq_arg3, _zzq_arg4, _zzq_arg5) \
1884b3a74204894e943c43cb8e8aae39d813040702csewardj  do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                        \
1894b3a74204894e943c43cb8e8aae39d813040702csewardj                    (_zzq_request), (_zzq_arg1), (_zzq_arg2),           \
1904b3a74204894e943c43cb8e8aae39d813040702csewardj                    (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
1914b3a74204894e943c43cb8e8aae39d813040702csewardj
1920ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#if defined(NVALGRIND)
19326aba4d3ef6cebc34879e82d88bcbe3c3b3b9f9enjn
19426aba4d3ef6cebc34879e82d88bcbe3c3b3b9f9enjn/* Define NVALGRIND to completely remove the Valgrind magic sequence
1950ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   from the compiled code (analogous to NDEBUG's effects on
1960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   assert()) */
197575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
198575ce8ef8fa86a502dabe152293320676922dcfebart        _zzq_default, _zzq_request,                               \
1999af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
200575ce8ef8fa86a502dabe152293320676922dcfebart      (_zzq_default)
20126aba4d3ef6cebc34879e82d88bcbe3c3b3b9f9enjn
2020ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#else  /* ! NVALGRIND */
2030ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
2040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* The following defines the magic code sequences which the JITter
2050ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   spots and handles magically.  Don't look too closely at them as
2060ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   they will rot your brain.
207de4a1d01951937632098a6cda45859afa587a06fsewardj
2080ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   The assembly code sequences for all architectures is in this one
2090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   file.  This is because this file must be stand-alone, and we don't
2100ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   want to have multiple files.
2110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
2120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default
2130ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   value gets put in the return slot, so that everything works when
2140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   this is executed not under Valgrind.  Args are passed in a memory
2150ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   block, and so there's no intrinsic limit to the number that could
2169af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj   be passed, but it's currently five.
217e90c6836fd430124799e52896c99ea27b1c88541nethercote
2185426544c9c3fc835ead99fae9e2054625110ef3enethercote   The macro args are:
2195426544c9c3fc835ead99fae9e2054625110ef3enethercote      _zzq_rlval    result lvalue
2205426544c9c3fc835ead99fae9e2054625110ef3enethercote      _zzq_default  default value (result returned when running on real CPU)
2215426544c9c3fc835ead99fae9e2054625110ef3enethercote      _zzq_request  request code
2229af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj      _zzq_arg1..5  request params
2235426544c9c3fc835ead99fae9e2054625110ef3enethercote
2240ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   The other two macros are used to support function wrapping, and are
225d68ac3e974d25f88492774f6baa491999afde9f9sewardj   a lot simpler.  VALGRIND_GET_NR_CONTEXT returns the value of the
226d68ac3e974d25f88492774f6baa491999afde9f9sewardj   guest's NRADDR pseudo-register and whatever other information is
227d68ac3e974d25f88492774f6baa491999afde9f9sewardj   needed to safely run the call original from the wrapper: on
228d68ac3e974d25f88492774f6baa491999afde9f9sewardj   ppc64-linux, the R2 value at the divert point is also needed.  This
229d68ac3e974d25f88492774f6baa491999afde9f9sewardj   information is abstracted into a user-visible type, OrigFn.
230d68ac3e974d25f88492774f6baa491999afde9f9sewardj
231d68ac3e974d25f88492774f6baa491999afde9f9sewardj   VALGRIND_CALL_NOREDIR_* behaves the same as the following on the
232d68ac3e974d25f88492774f6baa491999afde9f9sewardj   guest, but guarantees that the branch instruction will not be
233d68ac3e974d25f88492774f6baa491999afde9f9sewardj   redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64:
234d68ac3e974d25f88492774f6baa491999afde9f9sewardj   branch-and-link-to-r11.  VALGRIND_CALL_NOREDIR is just text, not a
235d68ac3e974d25f88492774f6baa491999afde9f9sewardj   complete inline asm, since it needs to be combined with more magic
236d68ac3e974d25f88492774f6baa491999afde9f9sewardj   inline asm stuff to be useful.
237e90c6836fd430124799e52896c99ea27b1c88541nethercote*/
238de4a1d01951937632098a6cda45859afa587a06fsewardj
239f76d27a697a7b0bf3b84490baf60623fc96a23afnjn/* ------------------------- x86-{linux,darwin} ---------------- */
2400ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
241520a03a4c59703908bae4cc437814abf0a24cdcdsewardj#if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)  \
242602278444fa6b4135a44d19ae833ed42a9898e48sewardj    ||  (defined(PLAT_x86_win32) && defined(__GNUC__))
243c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj
244c885844f7484a13bcf1c7f9b14cf5bc527462963sewardjtypedef
245c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj   struct {
246c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj      unsigned int nraddr; /* where's the code? */
247c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj   }
248c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj   OrigFn;
249c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj
2500ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
2510ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "roll $3,  %%edi ; roll $13, %%edi\n\t"      \
2521a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     "roll $29, %%edi ; roll $19, %%edi\n\t"
2530ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
254575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
255575ce8ef8fa86a502dabe152293320676922dcfebart        _zzq_default, _zzq_request,                               \
2569af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
257575ce8ef8fa86a502dabe152293320676922dcfebart  __extension__                                                   \
258575ce8ef8fa86a502dabe152293320676922dcfebart  ({volatile unsigned int _zzq_args[6];                           \
2590ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    volatile unsigned int _zzq_result;                            \
2600ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
2610ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
2620ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
2630ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
2640ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
2659af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
2660ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
2670ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     /* %EDX = client_request ( %EAX ) */         \
2680ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "xchgl %%ebx,%%ebx"                          \
2690ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "=d" (_zzq_result)                         \
2700ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
2710ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "cc", "memory"                             \
2720ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                    );                                            \
273575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_result;                                                  \
274575ce8ef8fa86a502dabe152293320676922dcfebart  })
2750ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
276c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
277c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
278c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj    volatile unsigned int __addr;                                 \
2790ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
2800ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     /* %EAX = guest_NRADDR */                    \
2810ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "xchgl %%ecx,%%ecx"                          \
2820ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "=a" (__addr)                              \
2830ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     :                                            \
2840ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "cc", "memory"                             \
2850ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                    );                                            \
286c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj    _zzq_orig->nraddr = __addr;                                   \
287ca0518df66f8c3375a860f1a55a51f18e2a16c44njn  }
2880ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
2890ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_CALL_NOREDIR_EAX                                 \
2900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     __SPECIAL_INSTRUCTION_PREAMBLE               \
2910ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     /* call-noredir *%EAX */                     \
2920ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "xchgl %%edx,%%edx\n\t"
293bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
294bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#define VALGRIND_VEX_INJECT_IR()                                 \
295bb913cd4cc1e56d7d7798a8b754361a05d01f916florian do {                                                            \
296bb913cd4cc1e56d7d7798a8b754361a05d01f916florian    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
297bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                     "xchgl %%edi,%%edi\n\t"                     \
298bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                     : : : "cc", "memory"                        \
299bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                    );                                           \
300bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } while (0)
301bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
302602278444fa6b4135a44d19ae833ed42a9898e48sewardj#endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */
3037f489813d200fb614a0856fca05e2f9ebf66dd48bart
3047f489813d200fb614a0856fca05e2f9ebf66dd48bart/* ------------------------- x86-Win32 ------------------------- */
3057f489813d200fb614a0856fca05e2f9ebf66dd48bart
3067f489813d200fb614a0856fca05e2f9ebf66dd48bart#if defined(PLAT_x86_win32) && !defined(__GNUC__)
3077f489813d200fb614a0856fca05e2f9ebf66dd48bart
3087f489813d200fb614a0856fca05e2f9ebf66dd48barttypedef
3097f489813d200fb614a0856fca05e2f9ebf66dd48bart   struct {
3107f489813d200fb614a0856fca05e2f9ebf66dd48bart      unsigned int nraddr; /* where's the code? */
3117f489813d200fb614a0856fca05e2f9ebf66dd48bart   }
3127f489813d200fb614a0856fca05e2f9ebf66dd48bart   OrigFn;
3137f489813d200fb614a0856fca05e2f9ebf66dd48bart
3147f489813d200fb614a0856fca05e2f9ebf66dd48bart#if defined(_MSC_VER)
3157f489813d200fb614a0856fca05e2f9ebf66dd48bart
3167f489813d200fb614a0856fca05e2f9ebf66dd48bart#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
3177f489813d200fb614a0856fca05e2f9ebf66dd48bart                     __asm rol edi, 3  __asm rol edi, 13          \
3187f489813d200fb614a0856fca05e2f9ebf66dd48bart                     __asm rol edi, 29 __asm rol edi, 19
3197f489813d200fb614a0856fca05e2f9ebf66dd48bart
320575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
321575ce8ef8fa86a502dabe152293320676922dcfebart        _zzq_default, _zzq_request,                               \
3227f489813d200fb614a0856fca05e2f9ebf66dd48bart        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
323575ce8ef8fa86a502dabe152293320676922dcfebart    valgrind_do_client_request_expr((uintptr_t)(_zzq_default),    \
324575ce8ef8fa86a502dabe152293320676922dcfebart        (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1),        \
325575ce8ef8fa86a502dabe152293320676922dcfebart        (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3),           \
326575ce8ef8fa86a502dabe152293320676922dcfebart        (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5))
327575ce8ef8fa86a502dabe152293320676922dcfebart
328575ce8ef8fa86a502dabe152293320676922dcfebartstatic __inline uintptr_t
329575ce8ef8fa86a502dabe152293320676922dcfebartvalgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request,
330575ce8ef8fa86a502dabe152293320676922dcfebart                                uintptr_t _zzq_arg1, uintptr_t _zzq_arg2,
331575ce8ef8fa86a502dabe152293320676922dcfebart                                uintptr_t _zzq_arg3, uintptr_t _zzq_arg4,
332575ce8ef8fa86a502dabe152293320676922dcfebart                                uintptr_t _zzq_arg5)
333575ce8ef8fa86a502dabe152293320676922dcfebart{
334575ce8ef8fa86a502dabe152293320676922dcfebart    volatile uintptr_t _zzq_args[6];
335575ce8ef8fa86a502dabe152293320676922dcfebart    volatile unsigned int _zzq_result;
336575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_args[0] = (uintptr_t)(_zzq_request);
337575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_args[1] = (uintptr_t)(_zzq_arg1);
338575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_args[2] = (uintptr_t)(_zzq_arg2);
339575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_args[3] = (uintptr_t)(_zzq_arg3);
340575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_args[4] = (uintptr_t)(_zzq_arg4);
341575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_args[5] = (uintptr_t)(_zzq_arg5);
342575ce8ef8fa86a502dabe152293320676922dcfebart    __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default
343575ce8ef8fa86a502dabe152293320676922dcfebart            __SPECIAL_INSTRUCTION_PREAMBLE
344575ce8ef8fa86a502dabe152293320676922dcfebart            /* %EDX = client_request ( %EAX ) */
345575ce8ef8fa86a502dabe152293320676922dcfebart            __asm xchg ebx,ebx
346575ce8ef8fa86a502dabe152293320676922dcfebart            __asm mov _zzq_result, edx
347575ce8ef8fa86a502dabe152293320676922dcfebart    }
348575ce8ef8fa86a502dabe152293320676922dcfebart    return _zzq_result;
349575ce8ef8fa86a502dabe152293320676922dcfebart}
3507f489813d200fb614a0856fca05e2f9ebf66dd48bart
3517f489813d200fb614a0856fca05e2f9ebf66dd48bart#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
3527f489813d200fb614a0856fca05e2f9ebf66dd48bart  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
3537f489813d200fb614a0856fca05e2f9ebf66dd48bart    volatile unsigned int __addr;                                 \
3547f489813d200fb614a0856fca05e2f9ebf66dd48bart    __asm { __SPECIAL_INSTRUCTION_PREAMBLE                        \
3557f489813d200fb614a0856fca05e2f9ebf66dd48bart            /* %EAX = guest_NRADDR */                             \
3567f489813d200fb614a0856fca05e2f9ebf66dd48bart            __asm xchg ecx,ecx                                    \
3577f489813d200fb614a0856fca05e2f9ebf66dd48bart            __asm mov __addr, eax                                 \
3587f489813d200fb614a0856fca05e2f9ebf66dd48bart    }                                                             \
3597f489813d200fb614a0856fca05e2f9ebf66dd48bart    _zzq_orig->nraddr = __addr;                                   \
3607f489813d200fb614a0856fca05e2f9ebf66dd48bart  }
3617f489813d200fb614a0856fca05e2f9ebf66dd48bart
3627f489813d200fb614a0856fca05e2f9ebf66dd48bart#define VALGRIND_CALL_NOREDIR_EAX ERROR
3637f489813d200fb614a0856fca05e2f9ebf66dd48bart
364bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#define VALGRIND_VEX_INJECT_IR()                                 \
365bb913cd4cc1e56d7d7798a8b754361a05d01f916florian do {                                                            \
366bb913cd4cc1e56d7d7798a8b754361a05d01f916florian    __asm { __SPECIAL_INSTRUCTION_PREAMBLE                       \
367bb913cd4cc1e56d7d7798a8b754361a05d01f916florian            __asm xchg edi,edi                                   \
368bb913cd4cc1e56d7d7798a8b754361a05d01f916florian    }                                                            \
369bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } while (0)
370bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
3717f489813d200fb614a0856fca05e2f9ebf66dd48bart#else
3727f489813d200fb614a0856fca05e2f9ebf66dd48bart#error Unsupported compiler.
3737f489813d200fb614a0856fca05e2f9ebf66dd48bart#endif
3747f489813d200fb614a0856fca05e2f9ebf66dd48bart
3757f489813d200fb614a0856fca05e2f9ebf66dd48bart#endif /* PLAT_x86_win32 */
3760ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
377f76d27a697a7b0bf3b84490baf60623fc96a23afnjn/* ------------------------ amd64-{linux,darwin} --------------- */
3780ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
379f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin)
380c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj
381c885844f7484a13bcf1c7f9b14cf5bc527462963sewardjtypedef
382c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj   struct {
383c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj      unsigned long long int nraddr; /* where's the code? */
384c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj   }
385c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj   OrigFn;
386c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj
3870ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
3880ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "rolq $3,  %%rdi ; rolq $13, %%rdi\n\t"      \
3891a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
3900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
391575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
392575ce8ef8fa86a502dabe152293320676922dcfebart        _zzq_default, _zzq_request,                               \
3939af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
394575ce8ef8fa86a502dabe152293320676922dcfebart    __extension__                                                 \
395575ce8ef8fa86a502dabe152293320676922dcfebart    ({ volatile unsigned long long int _zzq_args[6];              \
3960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    volatile unsigned long long int _zzq_result;                  \
3970ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[0] = (unsigned long long int)(_zzq_request);        \
3980ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[1] = (unsigned long long int)(_zzq_arg1);           \
3990ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[2] = (unsigned long long int)(_zzq_arg2);           \
4000ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[3] = (unsigned long long int)(_zzq_arg3);           \
4010ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[4] = (unsigned long long int)(_zzq_arg4);           \
4029af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj    _zzq_args[5] = (unsigned long long int)(_zzq_arg5);           \
4030ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
4040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     /* %RDX = client_request ( %RAX ) */         \
4050ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "xchgq %%rbx,%%rbx"                          \
4060ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "=d" (_zzq_result)                         \
4070ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
4080ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "cc", "memory"                             \
4090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                    );                                            \
410575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_result;                                                  \
411575ce8ef8fa86a502dabe152293320676922dcfebart    })
4120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
413c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
414c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
415c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj    volatile unsigned long long int __addr;                       \
4160ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
4170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     /* %RAX = guest_NRADDR */                    \
4180ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "xchgq %%rcx,%%rcx"                          \
4190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "=a" (__addr)                              \
4200ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     :                                            \
4210ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     : "cc", "memory"                             \
4220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                    );                                            \
423c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj    _zzq_orig->nraddr = __addr;                                   \
4242c48c7b0a453d32375a4df17e153011b797ef28csewardj  }
4250ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
4260ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_CALL_NOREDIR_RAX                                 \
4270ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     __SPECIAL_INSTRUCTION_PREAMBLE               \
4280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     /* call-noredir *%RAX */                     \
4290ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "xchgq %%rdx,%%rdx\n\t"
430bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
431bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#define VALGRIND_VEX_INJECT_IR()                                 \
432bb913cd4cc1e56d7d7798a8b754361a05d01f916florian do {                                                            \
433bb913cd4cc1e56d7d7798a8b754361a05d01f916florian    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
434bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                     "xchgq %%rdi,%%rdi\n\t"                     \
435bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                     : : : "cc", "memory"                        \
436bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                    );                                           \
437bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } while (0)
438bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
439f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
4400ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
441f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj/* ------------------------ ppc32-linux ------------------------ */
4420ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
443f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#if defined(PLAT_ppc32_linux)
444d68ac3e974d25f88492774f6baa491999afde9f9sewardj
445d68ac3e974d25f88492774f6baa491999afde9f9sewardjtypedef
446d68ac3e974d25f88492774f6baa491999afde9f9sewardj   struct {
447c885844f7484a13bcf1c7f9b14cf5bc527462963sewardj      unsigned int nraddr; /* where's the code? */
448d68ac3e974d25f88492774f6baa491999afde9f9sewardj   }
449d68ac3e974d25f88492774f6baa491999afde9f9sewardj   OrigFn;
450d68ac3e974d25f88492774f6baa491999afde9f9sewardj
4510ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
4520ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "rlwinm 0,0,3,0,0  ; rlwinm 0,0,13,0,0\n\t"  \
4531a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
4540ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
455575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
456575ce8ef8fa86a502dabe152293320676922dcfebart        _zzq_default, _zzq_request,                               \
4579af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
4580ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                                                                  \
459575ce8ef8fa86a502dabe152293320676922dcfebart    __extension__                                                 \
460575ce8ef8fa86a502dabe152293320676922dcfebart  ({         unsigned int  _zzq_args[6];                          \
4611c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj             unsigned int  _zzq_result;                           \
4621c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj             unsigned int* _zzq_ptr;                              \
4630ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
4640ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
4650ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
4660ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
4670ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
4689af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
4690ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_ptr = _zzq_args;                                         \
4701c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj    __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
4711c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     "mr 4,%2\n\t" /*ptr*/                        \
4721c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     __SPECIAL_INSTRUCTION_PREAMBLE               \
4730ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     /* %R3 = client_request ( %R4 ) */           \
4741c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     "or 1,1,1\n\t"                               \
4751c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     "mr %0,3"     /*result*/                     \
4761c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     : "=b" (_zzq_result)                         \
4771c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     : "b" (_zzq_default), "b" (_zzq_ptr)         \
4781c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     : "cc", "memory", "r3", "r4");               \
479575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_result;                                                  \
480575ce8ef8fa86a502dabe152293320676922dcfebart    })
4810ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
482d68ac3e974d25f88492774f6baa491999afde9f9sewardj#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
483d68ac3e974d25f88492774f6baa491999afde9f9sewardj  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
4841c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj    unsigned int __addr;                                          \
4850ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
4860ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     /* %R3 = guest_NRADDR */                     \
4871c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     "or 2,2,2\n\t"                               \
4881c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     "mr %0,3"                                    \
4891c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     : "=b" (__addr)                              \
4900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     :                                            \
4911c5bcb1e17532ec1630056fb2e58ef8e15267f15sewardj                     : "cc", "memory", "r3"                       \
4920ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                    );                                            \
493d68ac3e974d25f88492774f6baa491999afde9f9sewardj    _zzq_orig->nraddr = __addr;                                   \
4940ec07f32bbbb209d749b9974408e6f025ad40b31sewardj  }
4950ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
4960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
4970ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     __SPECIAL_INSTRUCTION_PREAMBLE               \
4980ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     /* branch-and-link-to-noredir *%R11 */       \
4990ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                     "or 3,3,3\n\t"
5004d261bbb67135fef7b1f947b025a0ff6b512cc57florian
5014d261bbb67135fef7b1f947b025a0ff6b512cc57florian#define VALGRIND_VEX_INJECT_IR()                                 \
5024d261bbb67135fef7b1f947b025a0ff6b512cc57florian do {                                                            \
5034d261bbb67135fef7b1f947b025a0ff6b512cc57florian    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
5044d261bbb67135fef7b1f947b025a0ff6b512cc57florian                     "or 5,5,5\n\t"                              \
5054d261bbb67135fef7b1f947b025a0ff6b512cc57florian                    );                                           \
5064d261bbb67135fef7b1f947b025a0ff6b512cc57florian } while (0)
5074d261bbb67135fef7b1f947b025a0ff6b512cc57florian
508f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#endif /* PLAT_ppc32_linux */
5090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
510f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj/* ------------------------ ppc64-linux ------------------------ */
5110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
512f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#if defined(PLAT_ppc64_linux)
513d68ac3e974d25f88492774f6baa491999afde9f9sewardj
514d68ac3e974d25f88492774f6baa491999afde9f9sewardjtypedef
515d68ac3e974d25f88492774f6baa491999afde9f9sewardj   struct {
516d68ac3e974d25f88492774f6baa491999afde9f9sewardj      unsigned long long int nraddr; /* where's the code? */
517d68ac3e974d25f88492774f6baa491999afde9f9sewardj      unsigned long long int r2;  /* what tocptr do we need? */
518d68ac3e974d25f88492774f6baa491999afde9f9sewardj   }
519d68ac3e974d25f88492774f6baa491999afde9f9sewardj   OrigFn;
520d68ac3e974d25f88492774f6baa491999afde9f9sewardj
5211a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
5221a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
5231a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
5241a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
525575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
526575ce8ef8fa86a502dabe152293320676922dcfebart        _zzq_default, _zzq_request,                               \
5279af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
5280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                                                                  \
529575ce8ef8fa86a502dabe152293320676922dcfebart  __extension__                                                   \
530575ce8ef8fa86a502dabe152293320676922dcfebart  ({         unsigned long long int  _zzq_args[6];                \
5318258a3a849f8bf47146ff1740d2dac429bb453a5sewardj             unsigned long long int  _zzq_result;                 \
5328258a3a849f8bf47146ff1740d2dac429bb453a5sewardj             unsigned long long int* _zzq_ptr;                    \
5331a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj    _zzq_args[0] = (unsigned long long int)(_zzq_request);        \
5341a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj    _zzq_args[1] = (unsigned long long int)(_zzq_arg1);           \
5351a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj    _zzq_args[2] = (unsigned long long int)(_zzq_arg2);           \
5361a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj    _zzq_args[3] = (unsigned long long int)(_zzq_arg3);           \
5371a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj    _zzq_args[4] = (unsigned long long int)(_zzq_arg4);           \
5389af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj    _zzq_args[5] = (unsigned long long int)(_zzq_arg5);           \
5390ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    _zzq_ptr = _zzq_args;                                         \
5408258a3a849f8bf47146ff1740d2dac429bb453a5sewardj    __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
5418258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     "mr 4,%2\n\t" /*ptr*/                        \
5428258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     __SPECIAL_INSTRUCTION_PREAMBLE               \
5431a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     /* %R3 = client_request ( %R4 ) */           \
5448258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     "or 1,1,1\n\t"                               \
5458258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     "mr %0,3"     /*result*/                     \
5468258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     : "=b" (_zzq_result)                         \
5478258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     : "b" (_zzq_default), "b" (_zzq_ptr)         \
5488258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     : "cc", "memory", "r3", "r4");               \
549575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_result;                                                  \
550575ce8ef8fa86a502dabe152293320676922dcfebart  })
5511a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
552d68ac3e974d25f88492774f6baa491999afde9f9sewardj#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
553d68ac3e974d25f88492774f6baa491999afde9f9sewardj  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
5548258a3a849f8bf47146ff1740d2dac429bb453a5sewardj    unsigned long long int __addr;                                \
5551a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
5561a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     /* %R3 = guest_NRADDR */                     \
5578258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     "or 2,2,2\n\t"                               \
5588258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     "mr %0,3"                                    \
5598258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     : "=b" (__addr)                              \
5601a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     :                                            \
5618258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     : "cc", "memory", "r3"                       \
5621a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                    );                                            \
563d68ac3e974d25f88492774f6baa491999afde9f9sewardj    _zzq_orig->nraddr = __addr;                                   \
564d68ac3e974d25f88492774f6baa491999afde9f9sewardj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
565d68ac3e974d25f88492774f6baa491999afde9f9sewardj                     /* %R3 = guest_NRADDR_GPR2 */                \
5668258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     "or 4,4,4\n\t"                               \
5678258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     "mr %0,3"                                    \
5688258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     : "=b" (__addr)                              \
569d68ac3e974d25f88492774f6baa491999afde9f9sewardj                     :                                            \
5708258a3a849f8bf47146ff1740d2dac429bb453a5sewardj                     : "cc", "memory", "r3"                       \
571d68ac3e974d25f88492774f6baa491999afde9f9sewardj                    );                                            \
572d68ac3e974d25f88492774f6baa491999afde9f9sewardj    _zzq_orig->r2 = __addr;                                       \
5730ec07f32bbbb209d749b9974408e6f025ad40b31sewardj  }
5741a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
5751a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
5761a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     __SPECIAL_INSTRUCTION_PREAMBLE               \
5771a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     /* branch-and-link-to-noredir *%R11 */       \
5781a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj                     "or 3,3,3\n\t"
5791a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
580bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#define VALGRIND_VEX_INJECT_IR()                                 \
581bb913cd4cc1e56d7d7798a8b754361a05d01f916florian do {                                                            \
582bb913cd4cc1e56d7d7798a8b754361a05d01f916florian    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
583bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                     "or 5,5,5\n\t"                              \
584bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                    );                                           \
585bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } while (0)
586bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
587f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#endif /* PLAT_ppc64_linux */
588f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj
58959570ffbe31930ab4d678754daaeec0715117a3dsewardj/* ------------------------- arm-linux ------------------------- */
59059570ffbe31930ab4d678754daaeec0715117a3dsewardj
59159570ffbe31930ab4d678754daaeec0715117a3dsewardj#if defined(PLAT_arm_linux)
59259570ffbe31930ab4d678754daaeec0715117a3dsewardj
59359570ffbe31930ab4d678754daaeec0715117a3dsewardjtypedef
59459570ffbe31930ab4d678754daaeec0715117a3dsewardj   struct {
59559570ffbe31930ab4d678754daaeec0715117a3dsewardj      unsigned int nraddr; /* where's the code? */
59659570ffbe31930ab4d678754daaeec0715117a3dsewardj   }
59759570ffbe31930ab4d678754daaeec0715117a3dsewardj   OrigFn;
59859570ffbe31930ab4d678754daaeec0715117a3dsewardj
59959570ffbe31930ab4d678754daaeec0715117a3dsewardj#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
60059570ffbe31930ab4d678754daaeec0715117a3dsewardj            "mov r12, r12, ror #3  ; mov r12, r12, ror #13 \n\t"  \
60159570ffbe31930ab4d678754daaeec0715117a3dsewardj            "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
60259570ffbe31930ab4d678754daaeec0715117a3dsewardj
603575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
604575ce8ef8fa86a502dabe152293320676922dcfebart        _zzq_default, _zzq_request,                               \
60559570ffbe31930ab4d678754daaeec0715117a3dsewardj        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
60659570ffbe31930ab4d678754daaeec0715117a3dsewardj                                                                  \
607575ce8ef8fa86a502dabe152293320676922dcfebart  __extension__                                                   \
608575ce8ef8fa86a502dabe152293320676922dcfebart  ({volatile unsigned int  _zzq_args[6];                          \
60959570ffbe31930ab4d678754daaeec0715117a3dsewardj    volatile unsigned int  _zzq_result;                           \
61059570ffbe31930ab4d678754daaeec0715117a3dsewardj    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
61159570ffbe31930ab4d678754daaeec0715117a3dsewardj    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
61259570ffbe31930ab4d678754daaeec0715117a3dsewardj    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
61359570ffbe31930ab4d678754daaeec0715117a3dsewardj    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
61459570ffbe31930ab4d678754daaeec0715117a3dsewardj    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
61559570ffbe31930ab4d678754daaeec0715117a3dsewardj    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
61659570ffbe31930ab4d678754daaeec0715117a3dsewardj    __asm__ volatile("mov r3, %1\n\t" /*default*/                 \
61759570ffbe31930ab4d678754daaeec0715117a3dsewardj                     "mov r4, %2\n\t" /*ptr*/                     \
61859570ffbe31930ab4d678754daaeec0715117a3dsewardj                     __SPECIAL_INSTRUCTION_PREAMBLE               \
61959570ffbe31930ab4d678754daaeec0715117a3dsewardj                     /* R3 = client_request ( R4 ) */             \
62059570ffbe31930ab4d678754daaeec0715117a3dsewardj                     "orr r10, r10, r10\n\t"                      \
62159570ffbe31930ab4d678754daaeec0715117a3dsewardj                     "mov %0, r3"     /*result*/                  \
62259570ffbe31930ab4d678754daaeec0715117a3dsewardj                     : "=r" (_zzq_result)                         \
62359570ffbe31930ab4d678754daaeec0715117a3dsewardj                     : "r" (_zzq_default), "r" (&_zzq_args[0])    \
62459570ffbe31930ab4d678754daaeec0715117a3dsewardj                     : "cc","memory", "r3", "r4");                \
625575ce8ef8fa86a502dabe152293320676922dcfebart    _zzq_result;                                                  \
626575ce8ef8fa86a502dabe152293320676922dcfebart  })
62759570ffbe31930ab4d678754daaeec0715117a3dsewardj
62859570ffbe31930ab4d678754daaeec0715117a3dsewardj#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
62959570ffbe31930ab4d678754daaeec0715117a3dsewardj  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
63059570ffbe31930ab4d678754daaeec0715117a3dsewardj    unsigned int __addr;                                          \
63159570ffbe31930ab4d678754daaeec0715117a3dsewardj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
63259570ffbe31930ab4d678754daaeec0715117a3dsewardj                     /* R3 = guest_NRADDR */                      \
63359570ffbe31930ab4d678754daaeec0715117a3dsewardj                     "orr r11, r11, r11\n\t"                      \
63459570ffbe31930ab4d678754daaeec0715117a3dsewardj                     "mov %0, r3"                                 \
63559570ffbe31930ab4d678754daaeec0715117a3dsewardj                     : "=r" (__addr)                              \
63659570ffbe31930ab4d678754daaeec0715117a3dsewardj                     :                                            \
63759570ffbe31930ab4d678754daaeec0715117a3dsewardj                     : "cc", "memory", "r3"                       \
63859570ffbe31930ab4d678754daaeec0715117a3dsewardj                    );                                            \
63959570ffbe31930ab4d678754daaeec0715117a3dsewardj    _zzq_orig->nraddr = __addr;                                   \
64059570ffbe31930ab4d678754daaeec0715117a3dsewardj  }
64159570ffbe31930ab4d678754daaeec0715117a3dsewardj
64259570ffbe31930ab4d678754daaeec0715117a3dsewardj#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                    \
64359570ffbe31930ab4d678754daaeec0715117a3dsewardj                     __SPECIAL_INSTRUCTION_PREAMBLE               \
64459570ffbe31930ab4d678754daaeec0715117a3dsewardj                     /* branch-and-link-to-noredir *%R4 */        \
64559570ffbe31930ab4d678754daaeec0715117a3dsewardj                     "orr r12, r12, r12\n\t"
64659570ffbe31930ab4d678754daaeec0715117a3dsewardj
647bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#define VALGRIND_VEX_INJECT_IR()                                 \
648bb913cd4cc1e56d7d7798a8b754361a05d01f916florian do {                                                            \
649bb913cd4cc1e56d7d7798a8b754361a05d01f916florian    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
650c379fec53a1e7a2ba8698f339ad67e370c9f0886sewardj                     "orr r9, r9, r9\n\t"                        \
651bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                     : : : "cc", "memory"                        \
652bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                    );                                           \
653bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } while (0)
654bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
65559570ffbe31930ab4d678754daaeec0715117a3dsewardj#endif /* PLAT_arm_linux */
65659570ffbe31930ab4d678754daaeec0715117a3dsewardj
657b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* ------------------------ s390x-linux ------------------------ */
658b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
659b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#if defined(PLAT_s390x_linux)
660b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
661b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjtypedef
662b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  struct {
663b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     unsigned long long int nraddr; /* where's the code? */
664b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  }
665b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  OrigFn;
666b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
667b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* __SPECIAL_INSTRUCTION_PREAMBLE will be used to identify Valgrind specific
668b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj * code. This detection is implemented in platform specific toIR.c
669b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj * (e.g. VEX/priv/guest_s390_decoder.c).
670b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj */
671b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define __SPECIAL_INSTRUCTION_PREAMBLE                           \
672b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     "lr 15,15\n\t"                              \
673b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     "lr 1,1\n\t"                                \
674b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     "lr 2,2\n\t"                                \
675b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     "lr 3,3\n\t"
676b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
677b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define __CLIENT_REQUEST_CODE "lr 2,2\n\t"
678b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define __GET_NR_CONTEXT_CODE "lr 3,3\n\t"
679b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define __CALL_NO_REDIR_CODE  "lr 4,4\n\t"
680bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#define __VEX_INJECT_IR_CODE  "lr 5,5\n\t"
681b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
682575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                         \
683575ce8ef8fa86a502dabe152293320676922dcfebart       _zzq_default, _zzq_request,                               \
684b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj       _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
685575ce8ef8fa86a502dabe152293320676922dcfebart  __extension__                                                  \
686575ce8ef8fa86a502dabe152293320676922dcfebart ({volatile unsigned long long int _zzq_args[6];                 \
687b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   volatile unsigned long long int _zzq_result;                  \
688b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   _zzq_args[0] = (unsigned long long int)(_zzq_request);        \
689b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   _zzq_args[1] = (unsigned long long int)(_zzq_arg1);           \
690b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   _zzq_args[2] = (unsigned long long int)(_zzq_arg2);           \
691b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   _zzq_args[3] = (unsigned long long int)(_zzq_arg3);           \
692b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   _zzq_args[4] = (unsigned long long int)(_zzq_arg4);           \
693b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   _zzq_args[5] = (unsigned long long int)(_zzq_arg5);           \
694b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   __asm__ volatile(/* r2 = args */                              \
695b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    "lgr 2,%1\n\t"                               \
696b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    /* r3 = default */                           \
697b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    "lgr 3,%2\n\t"                               \
698b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    __SPECIAL_INSTRUCTION_PREAMBLE               \
699b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    __CLIENT_REQUEST_CODE                        \
700b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    /* results = r3 */                           \
701b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    "lgr %0, 3\n\t"                              \
702b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    : "=d" (_zzq_result)                         \
703b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
704b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    : "cc", "2", "3", "memory"                   \
705b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                   );                                            \
706575ce8ef8fa86a502dabe152293320676922dcfebart   _zzq_result;                                                  \
707575ce8ef8fa86a502dabe152293320676922dcfebart })
708b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
709b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                      \
710b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
711b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   volatile unsigned long long int __addr;                       \
712b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
713b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    __GET_NR_CONTEXT_CODE                        \
714b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    "lgr %0, 3\n\t"                              \
715b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    : "=a" (__addr)                              \
716b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    :                                            \
717b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    : "cc", "3", "memory"                        \
718b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                   );                                            \
719b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   _zzq_orig->nraddr = __addr;                                   \
720b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj }
721b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
722b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define VALGRIND_CALL_NOREDIR_R1                                 \
723b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    __SPECIAL_INSTRUCTION_PREAMBLE               \
724b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                    __CALL_NO_REDIR_CODE
725b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
726bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#define VALGRIND_VEX_INJECT_IR()                                 \
727bb913cd4cc1e56d7d7798a8b754361a05d01f916florian do {                                                            \
728bb913cd4cc1e56d7d7798a8b754361a05d01f916florian    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
729bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                     __VEX_INJECT_IR_CODE);                      \
730bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } while (0)
731bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
732b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#endif /* PLAT_s390x_linux */
733b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
7345db15403e889d4db339b342bc2a824ef0bfaa654sewardj/* ------------------------- mips32-linux ---------------- */
7355db15403e889d4db339b342bc2a824ef0bfaa654sewardj
7365db15403e889d4db339b342bc2a824ef0bfaa654sewardj#if defined(PLAT_mips32_linux)
7375db15403e889d4db339b342bc2a824ef0bfaa654sewardj
7385db15403e889d4db339b342bc2a824ef0bfaa654sewardjtypedef
7395db15403e889d4db339b342bc2a824ef0bfaa654sewardj   struct {
7405db15403e889d4db339b342bc2a824ef0bfaa654sewardj      unsigned int nraddr; /* where's the code? */
7415db15403e889d4db339b342bc2a824ef0bfaa654sewardj   }
7425db15403e889d4db339b342bc2a824ef0bfaa654sewardj   OrigFn;
7435db15403e889d4db339b342bc2a824ef0bfaa654sewardj
7445db15403e889d4db339b342bc2a824ef0bfaa654sewardj/* .word  0x342
7455db15403e889d4db339b342bc2a824ef0bfaa654sewardj * .word  0x742
7465db15403e889d4db339b342bc2a824ef0bfaa654sewardj * .word  0xC2
7475db15403e889d4db339b342bc2a824ef0bfaa654sewardj * .word  0x4C2*/
7485db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define __SPECIAL_INSTRUCTION_PREAMBLE          \
7495db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     "srl $0, $0, 13\n\t"       \
7505db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     "srl $0, $0, 29\n\t"       \
7515db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     "srl $0, $0, 3\n\t"        \
7525db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     "srl $0, $0, 19\n\t"
7535db15403e889d4db339b342bc2a824ef0bfaa654sewardj
7545db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
7555db15403e889d4db339b342bc2a824ef0bfaa654sewardj       _zzq_default, _zzq_request,                                \
7565db15403e889d4db339b342bc2a824ef0bfaa654sewardj       _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)     \
7575db15403e889d4db339b342bc2a824ef0bfaa654sewardj  __extension__                                                   \
7585db15403e889d4db339b342bc2a824ef0bfaa654sewardj  ({ volatile unsigned int _zzq_args[6];                          \
7595db15403e889d4db339b342bc2a824ef0bfaa654sewardj    volatile unsigned int _zzq_result;                            \
7605db15403e889d4db339b342bc2a824ef0bfaa654sewardj    _zzq_args[0] = (unsigned int)(_zzq_request);                  \
7615db15403e889d4db339b342bc2a824ef0bfaa654sewardj    _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
7625db15403e889d4db339b342bc2a824ef0bfaa654sewardj    _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
7635db15403e889d4db339b342bc2a824ef0bfaa654sewardj    _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
7645db15403e889d4db339b342bc2a824ef0bfaa654sewardj    _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
7655db15403e889d4db339b342bc2a824ef0bfaa654sewardj    _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
7665db15403e889d4db339b342bc2a824ef0bfaa654sewardj        __asm__ volatile("move $11, %1\n\t" /*default*/           \
7675db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     "move $12, %2\n\t" /*ptr*/                   \
7685db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     __SPECIAL_INSTRUCTION_PREAMBLE               \
7695db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     /* T3 = client_request ( T4 ) */             \
7705db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     "or $13, $13, $13\n\t"                       \
7715db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     "move %0, $11\n\t"     /*result*/            \
7725db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     : "=r" (_zzq_result)                         \
7735db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     : "r" (_zzq_default), "r" (&_zzq_args[0])    \
7744df0bfc0614379192c780c944415dc420d9cfe8epetarj                     : "$11", "$12");                             \
7755db15403e889d4db339b342bc2a824ef0bfaa654sewardj    _zzq_result;                                                  \
7765db15403e889d4db339b342bc2a824ef0bfaa654sewardj  })
7775db15403e889d4db339b342bc2a824ef0bfaa654sewardj
7785db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
7795db15403e889d4db339b342bc2a824ef0bfaa654sewardj  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
7805db15403e889d4db339b342bc2a824ef0bfaa654sewardj    volatile unsigned int __addr;                                 \
7815db15403e889d4db339b342bc2a824ef0bfaa654sewardj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
7825db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     /* %t9 = guest_NRADDR */                     \
7835db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     "or $14, $14, $14\n\t"                       \
7845db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     "move %0, $11"     /*result*/                \
7855db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     : "=r" (__addr)                              \
7865db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     :                                            \
7874df0bfc0614379192c780c944415dc420d9cfe8epetarj                     : "$11"                                      \
7885db15403e889d4db339b342bc2a824ef0bfaa654sewardj                    );                                            \
7895db15403e889d4db339b342bc2a824ef0bfaa654sewardj    _zzq_orig->nraddr = __addr;                                   \
7905db15403e889d4db339b342bc2a824ef0bfaa654sewardj  }
7915db15403e889d4db339b342bc2a824ef0bfaa654sewardj
7925db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define VALGRIND_CALL_NOREDIR_T9                                 \
7935db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     __SPECIAL_INSTRUCTION_PREAMBLE              \
7945db15403e889d4db339b342bc2a824ef0bfaa654sewardj                     /* call-noredir *%t9 */                     \
795bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                     "or $15, $15, $15\n\t"
796bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
797bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#define VALGRIND_VEX_INJECT_IR()                                 \
798bb913cd4cc1e56d7d7798a8b754361a05d01f916florian do {                                                            \
799bb913cd4cc1e56d7d7798a8b754361a05d01f916florian    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
800bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                     "or $11, $11, $11\n\t"                      \
801bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                    );                                           \
802bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } while (0)
803bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
804bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
8055db15403e889d4db339b342bc2a824ef0bfaa654sewardj#endif /* PLAT_mips32_linux */
8065db15403e889d4db339b342bc2a824ef0bfaa654sewardj
8074df0bfc0614379192c780c944415dc420d9cfe8epetarj/* ------------------------- mips64-linux ---------------- */
8084df0bfc0614379192c780c944415dc420d9cfe8epetarj
8094df0bfc0614379192c780c944415dc420d9cfe8epetarj#if defined(PLAT_mips64_linux)
8104df0bfc0614379192c780c944415dc420d9cfe8epetarj
8114df0bfc0614379192c780c944415dc420d9cfe8epetarjtypedef
8124df0bfc0614379192c780c944415dc420d9cfe8epetarj   struct {
8134df0bfc0614379192c780c944415dc420d9cfe8epetarj      unsigned long long nraddr; /* where's the code? */
8144df0bfc0614379192c780c944415dc420d9cfe8epetarj   }
8154df0bfc0614379192c780c944415dc420d9cfe8epetarj   OrigFn;
8164df0bfc0614379192c780c944415dc420d9cfe8epetarj
8174df0bfc0614379192c780c944415dc420d9cfe8epetarj/* dsll $0,$0, 3
8184df0bfc0614379192c780c944415dc420d9cfe8epetarj * dsll $0,$0, 13
8194df0bfc0614379192c780c944415dc420d9cfe8epetarj * dsll $0,$0, 29
8204df0bfc0614379192c780c944415dc420d9cfe8epetarj * dsll $0,$0, 19*/
8214df0bfc0614379192c780c944415dc420d9cfe8epetarj#define __SPECIAL_INSTRUCTION_PREAMBLE                              \
8224df0bfc0614379192c780c944415dc420d9cfe8epetarj                     "dsll $0,$0, 3 ; dsll $0,$0,13\n\t"            \
8234df0bfc0614379192c780c944415dc420d9cfe8epetarj                     "dsll $0,$0,29 ; dsll $0,$0,19\n\t"
8244df0bfc0614379192c780c944415dc420d9cfe8epetarj
8254df0bfc0614379192c780c944415dc420d9cfe8epetarj#define VALGRIND_DO_CLIENT_REQUEST_EXPR(                            \
8264df0bfc0614379192c780c944415dc420d9cfe8epetarj       _zzq_default, _zzq_request,                                  \
8274df0bfc0614379192c780c944415dc420d9cfe8epetarj       _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)       \
8284df0bfc0614379192c780c944415dc420d9cfe8epetarj  __extension__                                                     \
8294df0bfc0614379192c780c944415dc420d9cfe8epetarj  ({ volatile unsigned long long int _zzq_args[6];                  \
8304df0bfc0614379192c780c944415dc420d9cfe8epetarj    volatile unsigned long long int _zzq_result;                    \
8314df0bfc0614379192c780c944415dc420d9cfe8epetarj    _zzq_args[0] = (unsigned long long int)(_zzq_request);          \
8324df0bfc0614379192c780c944415dc420d9cfe8epetarj    _zzq_args[1] = (unsigned long long int)(_zzq_arg1);             \
8334df0bfc0614379192c780c944415dc420d9cfe8epetarj    _zzq_args[2] = (unsigned long long int)(_zzq_arg2);             \
8344df0bfc0614379192c780c944415dc420d9cfe8epetarj    _zzq_args[3] = (unsigned long long int)(_zzq_arg3);             \
8354df0bfc0614379192c780c944415dc420d9cfe8epetarj    _zzq_args[4] = (unsigned long long int)(_zzq_arg4);             \
8364df0bfc0614379192c780c944415dc420d9cfe8epetarj    _zzq_args[5] = (unsigned long long int)(_zzq_arg5);             \
8374df0bfc0614379192c780c944415dc420d9cfe8epetarj        __asm__ volatile("move $11, %1\n\t" /*default*/             \
8384df0bfc0614379192c780c944415dc420d9cfe8epetarj                         "move $12, %2\n\t" /*ptr*/                 \
8394df0bfc0614379192c780c944415dc420d9cfe8epetarj                         __SPECIAL_INSTRUCTION_PREAMBLE             \
8404df0bfc0614379192c780c944415dc420d9cfe8epetarj                         /* $11 = client_request ( $12 ) */         \
8414df0bfc0614379192c780c944415dc420d9cfe8epetarj                         "or $13, $13, $13\n\t"                     \
8424df0bfc0614379192c780c944415dc420d9cfe8epetarj                         "move %0, $11\n\t"     /*result*/          \
8434df0bfc0614379192c780c944415dc420d9cfe8epetarj                         : "=r" (_zzq_result)                       \
8444df0bfc0614379192c780c944415dc420d9cfe8epetarj                         : "r" (_zzq_default), "r" (&_zzq_args[0])  \
8454df0bfc0614379192c780c944415dc420d9cfe8epetarj                         : "$11", "$12");                           \
8464df0bfc0614379192c780c944415dc420d9cfe8epetarj    _zzq_result;                                                    \
8474df0bfc0614379192c780c944415dc420d9cfe8epetarj  })
8484df0bfc0614379192c780c944415dc420d9cfe8epetarj
8494df0bfc0614379192c780c944415dc420d9cfe8epetarj#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                         \
8504df0bfc0614379192c780c944415dc420d9cfe8epetarj  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                     \
8514df0bfc0614379192c780c944415dc420d9cfe8epetarj    volatile unsigned long long int __addr;                         \
8524df0bfc0614379192c780c944415dc420d9cfe8epetarj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
8534df0bfc0614379192c780c944415dc420d9cfe8epetarj                     /* $11 = guest_NRADDR */                       \
8544df0bfc0614379192c780c944415dc420d9cfe8epetarj                     "or $14, $14, $14\n\t"                         \
8554df0bfc0614379192c780c944415dc420d9cfe8epetarj                     "move %0, $11"     /*result*/                  \
8564df0bfc0614379192c780c944415dc420d9cfe8epetarj                     : "=r" (__addr)                                \
8574df0bfc0614379192c780c944415dc420d9cfe8epetarj                     :                                              \
8584df0bfc0614379192c780c944415dc420d9cfe8epetarj                     : "$11");                                      \
8594df0bfc0614379192c780c944415dc420d9cfe8epetarj    _zzq_orig->nraddr = __addr;                                     \
8604df0bfc0614379192c780c944415dc420d9cfe8epetarj  }
8614df0bfc0614379192c780c944415dc420d9cfe8epetarj
8624df0bfc0614379192c780c944415dc420d9cfe8epetarj#define VALGRIND_CALL_NOREDIR_T9                                    \
8634df0bfc0614379192c780c944415dc420d9cfe8epetarj                     __SPECIAL_INSTRUCTION_PREAMBLE                 \
8644df0bfc0614379192c780c944415dc420d9cfe8epetarj                     /* call-noredir $25 */                         \
8654df0bfc0614379192c780c944415dc420d9cfe8epetarj                     "or $15, $15, $15\n\t"
8664df0bfc0614379192c780c944415dc420d9cfe8epetarj
8674df0bfc0614379192c780c944415dc420d9cfe8epetarj#define VALGRIND_VEX_INJECT_IR()                                    \
8684df0bfc0614379192c780c944415dc420d9cfe8epetarj do {                                                               \
8694df0bfc0614379192c780c944415dc420d9cfe8epetarj    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
8704df0bfc0614379192c780c944415dc420d9cfe8epetarj                     "or $11, $11, $11\n\t"                         \
8714df0bfc0614379192c780c944415dc420d9cfe8epetarj                    );                                              \
8724df0bfc0614379192c780c944415dc420d9cfe8epetarj } while (0)
8734df0bfc0614379192c780c944415dc420d9cfe8epetarj
8744df0bfc0614379192c780c944415dc420d9cfe8epetarj#endif /* PLAT_mips64_linux */
8754df0bfc0614379192c780c944415dc420d9cfe8epetarj
876f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj/* Insert assembly code for other platforms here... */
87726aba4d3ef6cebc34879e82d88bcbe3c3b3b9f9enjn
87837091fb739760631f436043c47de612cf9fd2dd1sewardj#endif /* NVALGRIND */
8792e93c50dc50235189661b70e3f27a4098d5cccccsewardj
88069d9c4625034b60c08e04cc246fcf8093d23fde5nethercote
88130d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn/* ------------------------------------------------------------------ */
882f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj/* PLATFORM SPECIFICS for FUNCTION WRAPPING.  This is all very        */
8830ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* ugly.  It's the least-worst tradeoff I can think of.               */
8840ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* ------------------------------------------------------------------ */
8850ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
8860ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* This section defines magic (a.k.a appalling-hack) macros for doing
8870ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   guaranteed-no-redirection macros, so as to get from function
8880ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   wrappers to the functions they are wrapping.  The whole point is to
8890ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   construct standard call sequences, but to do the call itself with a
8900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   special no-redirect call pseudo-instruction that the JIT
8910ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   understands and handles specially.  This section is long and
8920ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   repetitious, and I can't see a way to make it shorter.
8930ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
8940ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   The naming scheme is as follows:
8950ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
8960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc}
8970ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
8980ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   'W' stands for "word" and 'v' for "void".  Hence there are
8990ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   different macros for calling arity 0, 1, 2, 3, 4, etc, functions,
9000ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   and for each, the possibility of returning a word-typed result, or
9010ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   no result.
9020ec07f32bbbb209d749b9974408e6f025ad40b31sewardj*/
9030ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
9040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* Use these to write the name of your wrapper.  NOTE: duplicates
90585cf90056b7a8d98d88335b47c599a35b35ff7casewardj   VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h.  NOTE also: inserts
90685cf90056b7a8d98d88335b47c599a35b35ff7casewardj   the default behaviour equivalance class tag "0000" into the name.
90785cf90056b7a8d98d88335b47c599a35b35ff7casewardj   See pub_tool_redir.h for details -- normally you don't need to
90885cf90056b7a8d98d88335b47c599a35b35ff7casewardj   think about this, though. */
9090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
9105f5ef2ae9e7c2ce5ebc36c1e2fc98e5f81650be3njn/* Use an extra level of macroisation so as to ensure the soname/fnname
9115f5ef2ae9e7c2ce5ebc36c1e2fc98e5f81650be3njn   args are fully macro-expanded before pasting them together. */
9125f5ef2ae9e7c2ce5ebc36c1e2fc98e5f81650be3njn#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
9135f5ef2ae9e7c2ce5ebc36c1e2fc98e5f81650be3njn
9140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname)                    \
91596044842731e581702c9ed4104d2949fcde20fd8sewardj   VG_CONCAT4(_vgw00000ZU_,soname,_,fnname)
9160ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
9170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname)                    \
91896044842731e581702c9ed4104d2949fcde20fd8sewardj   VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname)
9190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
920d68ac3e974d25f88492774f6baa491999afde9f9sewardj/* Use this macro from within a wrapper function to collect the
921d68ac3e974d25f88492774f6baa491999afde9f9sewardj   context (address and possibly other info) of the original function.
922d68ac3e974d25f88492774f6baa491999afde9f9sewardj   Once you have that you can then use it in one of the CALL_FN_
923d68ac3e974d25f88492774f6baa491999afde9f9sewardj   macros.  The type of the argument _lval is OrigFn. */
924d68ac3e974d25f88492774f6baa491999afde9f9sewardj#define VALGRIND_GET_ORIG_FN(_lval)  VALGRIND_GET_NR_CONTEXT(_lval)
9250ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
926573f8bc106cf3646bdb62748820287c9c44bd432sewardj/* Also provide end-user facilities for function replacement, rather
927573f8bc106cf3646bdb62748820287c9c44bd432sewardj   than wrapping.  A replacement function differs from a wrapper in
928573f8bc106cf3646bdb62748820287c9c44bd432sewardj   that it has no way to get hold of the original function being
929573f8bc106cf3646bdb62748820287c9c44bd432sewardj   called, and hence no way to call onwards to it.  In a replacement
930573f8bc106cf3646bdb62748820287c9c44bd432sewardj   function, VALGRIND_GET_ORIG_FN always returns zero. */
931573f8bc106cf3646bdb62748820287c9c44bd432sewardj
932573f8bc106cf3646bdb62748820287c9c44bd432sewardj#define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname)                 \
933573f8bc106cf3646bdb62748820287c9c44bd432sewardj   VG_CONCAT4(_vgr00000ZU_,soname,_,fnname)
934573f8bc106cf3646bdb62748820287c9c44bd432sewardj
935573f8bc106cf3646bdb62748820287c9c44bd432sewardj#define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname)                 \
936573f8bc106cf3646bdb62748820287c9c44bd432sewardj   VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname)
937573f8bc106cf3646bdb62748820287c9c44bd432sewardj
9380ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* Derivatives of the main macros below, for calling functions
9390ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   returning void. */
9400ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
9410ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define CALL_FN_v_v(fnptr)                                        \
9420ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do { volatile unsigned long _junk;                             \
9430ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        CALL_FN_W_v(_junk,fnptr); } while (0)
9440ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
9450ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define CALL_FN_v_W(fnptr, arg1)                                  \
9460ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do { volatile unsigned long _junk;                             \
9470ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
9480ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
9490ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define CALL_FN_v_WW(fnptr, arg1,arg2)                            \
9500ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do { volatile unsigned long _junk;                             \
9510ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
9520ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
9535ce4b150ce5d32c9af07a24717081ea34568388asewardj#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3)                      \
9545ce4b150ce5d32c9af07a24717081ea34568388asewardj   do { volatile unsigned long _junk;                             \
9555ce4b150ce5d32c9af07a24717081ea34568388asewardj        CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
9565ce4b150ce5d32c9af07a24717081ea34568388asewardj
9572b5f0a90334a2271791c110548a842fadb5ffc65njn#define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4)                \
9582b5f0a90334a2271791c110548a842fadb5ffc65njn   do { volatile unsigned long _junk;                             \
9592b5f0a90334a2271791c110548a842fadb5ffc65njn        CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
9602b5f0a90334a2271791c110548a842fadb5ffc65njn
9612b5f0a90334a2271791c110548a842fadb5ffc65njn#define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5)             \
9622b5f0a90334a2271791c110548a842fadb5ffc65njn   do { volatile unsigned long _junk;                             \
9632b5f0a90334a2271791c110548a842fadb5ffc65njn        CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
9642b5f0a90334a2271791c110548a842fadb5ffc65njn
9652b5f0a90334a2271791c110548a842fadb5ffc65njn#define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6)        \
9662b5f0a90334a2271791c110548a842fadb5ffc65njn   do { volatile unsigned long _junk;                             \
9672b5f0a90334a2271791c110548a842fadb5ffc65njn        CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
9682b5f0a90334a2271791c110548a842fadb5ffc65njn
9692b5f0a90334a2271791c110548a842fadb5ffc65njn#define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7)   \
9702b5f0a90334a2271791c110548a842fadb5ffc65njn   do { volatile unsigned long _junk;                             \
9712b5f0a90334a2271791c110548a842fadb5ffc65njn        CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
9722b5f0a90334a2271791c110548a842fadb5ffc65njn
973f76d27a697a7b0bf3b84490baf60623fc96a23afnjn/* ------------------------- x86-{linux,darwin} ---------------- */
9740ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
975f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)
9760ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
9770ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* These regs are trashed by the hidden call.  No need to mention eax
9780ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   as gcc can already see that, plus causes gcc to bomb. */
9790ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx"
9800ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
9814118e0f0df0468b3eccf2515d13c3d9c478d6f16tom/* Macros to save and align the stack before making a function
9824118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   call and restore it afterwards as gcc may not keep the stack
9834118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   pointer aligned if it doesn't realise calls are being made
9844118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   to other functions. */
9854118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
9864118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_ALIGN_STACK               \
9874118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "movl %%esp,%%edi\n\t"               \
9884118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "andl $0xfffffff0,%%esp\n\t"
9894118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_RESTORE_STACK             \
9904118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "movl %%edi,%%esp\n\t"
9914118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
9920ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned
9930ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   long) == 4. */
9940ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
99566226cc1e5e852de3584c76984dace8679730b42sewardj#define CALL_FN_W_v(lval, orig)                                   \
9960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
99766226cc1e5e852de3584c76984dace8679730b42sewardj      volatile OrigFn        _orig = (orig);                      \
9980ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[1];                          \
9990ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
100066226cc1e5e852de3584c76984dace8679730b42sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
10010ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
10024118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
10030ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
10040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_CALL_NOREDIR_EAX                                \
10054118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
10060ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=a" (_res)                                  \
10070ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "a" (&_argvec[0])                            \
10084118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
10090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
10100ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
10110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
10120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
101366226cc1e5e852de3584c76984dace8679730b42sewardj#define CALL_FN_W_W(lval, orig, arg1)                             \
10140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
101566226cc1e5e852de3584c76984dace8679730b42sewardj      volatile OrigFn        _orig = (orig);                      \
10160ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[2];                          \
10170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
101866226cc1e5e852de3584c76984dace8679730b42sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
10190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)(arg1);                         \
10200ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
10214118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
102287a287b47f496063f5869dc5039a81baeb6a29aesewardj         "subl $12, %%esp\n\t"                                    \
10230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 4(%%eax)\n\t"                                     \
10240ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
10250ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_CALL_NOREDIR_EAX                                \
10264118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
10270ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=a" (_res)                                  \
10280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "a" (&_argvec[0])                            \
10294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
10300ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
10310ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
10320ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
10330ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
103466226cc1e5e852de3584c76984dace8679730b42sewardj#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
10350ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
103666226cc1e5e852de3584c76984dace8679730b42sewardj      volatile OrigFn        _orig = (orig);                      \
10370ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[3];                          \
10380ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
103966226cc1e5e852de3584c76984dace8679730b42sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
10400ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)(arg1);                         \
10410ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[2] = (unsigned long)(arg2);                         \
10420ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
10434118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
104487a287b47f496063f5869dc5039a81baeb6a29aesewardj         "subl $8, %%esp\n\t"                                     \
10450ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 8(%%eax)\n\t"                                     \
10460ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 4(%%eax)\n\t"                                     \
10470ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
10480ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_CALL_NOREDIR_EAX                                \
10494118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
10500ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=a" (_res)                                  \
10519e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj         : /*in*/    "a" (&_argvec[0])                            \
10524118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
10539e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      );                                                          \
10549e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      lval = (__typeof__(lval)) _res;                             \
10559e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj   } while (0)
10569e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj
10579e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
10589e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj   do {                                                           \
10599e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      volatile OrigFn        _orig = (orig);                      \
10609e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      volatile unsigned long _argvec[4];                          \
10619e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      volatile unsigned long _res;                                \
10629e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
10639e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      _argvec[1] = (unsigned long)(arg1);                         \
10649e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      _argvec[2] = (unsigned long)(arg2);                         \
10659e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      _argvec[3] = (unsigned long)(arg3);                         \
10669e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj      __asm__ volatile(                                           \
10674118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
106887a287b47f496063f5869dc5039a81baeb6a29aesewardj         "subl $4, %%esp\n\t"                                     \
10699e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj         "pushl 12(%%eax)\n\t"                                    \
10709e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj         "pushl 8(%%eax)\n\t"                                     \
10719e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj         "pushl 4(%%eax)\n\t"                                     \
10729e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
10739e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj         VALGRIND_CALL_NOREDIR_EAX                                \
10744118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
10759e8b07ab0fb74fb15098c406a5dc71e273d50b1csewardj         : /*out*/   "=a" (_res)                                  \
10760ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "a" (&_argvec[0])                            \
10774118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
10780ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
10790ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
10800ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
10810ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
108266226cc1e5e852de3584c76984dace8679730b42sewardj#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
10830ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
108466226cc1e5e852de3584c76984dace8679730b42sewardj      volatile OrigFn        _orig = (orig);                      \
10850ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[5];                          \
10860ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
108766226cc1e5e852de3584c76984dace8679730b42sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
10880ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)(arg1);                         \
10890ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[2] = (unsigned long)(arg2);                         \
10900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[3] = (unsigned long)(arg3);                         \
10910ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[4] = (unsigned long)(arg4);                         \
10920ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
10934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
10940ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 16(%%eax)\n\t"                                    \
10950ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 12(%%eax)\n\t"                                    \
10960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 8(%%eax)\n\t"                                     \
10970ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 4(%%eax)\n\t"                                     \
10980ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
10990ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_CALL_NOREDIR_EAX                                \
11004118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
11010ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=a" (_res)                                  \
11020ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "a" (&_argvec[0])                            \
11034118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
11040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
11050ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
11060ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
11070ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
110866226cc1e5e852de3584c76984dace8679730b42sewardj#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
11090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
111066226cc1e5e852de3584c76984dace8679730b42sewardj      volatile OrigFn        _orig = (orig);                      \
11110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[6];                          \
11120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
111366226cc1e5e852de3584c76984dace8679730b42sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
11140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)(arg1);                         \
11150ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[2] = (unsigned long)(arg2);                         \
11160ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[3] = (unsigned long)(arg3);                         \
11170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[4] = (unsigned long)(arg4);                         \
11180ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[5] = (unsigned long)(arg5);                         \
11190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
11204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
112187a287b47f496063f5869dc5039a81baeb6a29aesewardj         "subl $12, %%esp\n\t"                                    \
11220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 20(%%eax)\n\t"                                    \
11230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 16(%%eax)\n\t"                                    \
11240ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 12(%%eax)\n\t"                                    \
11250ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 8(%%eax)\n\t"                                     \
11260ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 4(%%eax)\n\t"                                     \
11270ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
11280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_CALL_NOREDIR_EAX                                \
11294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
11300ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=a" (_res)                                  \
11310ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "a" (&_argvec[0])                            \
11324118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
11330ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
11340ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
11350ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
11360ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
113766226cc1e5e852de3584c76984dace8679730b42sewardj#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
11380ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
113966226cc1e5e852de3584c76984dace8679730b42sewardj      volatile OrigFn        _orig = (orig);                      \
11400ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[7];                          \
11410ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
114266226cc1e5e852de3584c76984dace8679730b42sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
11430ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)(arg1);                         \
11440ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[2] = (unsigned long)(arg2);                         \
11450ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[3] = (unsigned long)(arg3);                         \
11460ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[4] = (unsigned long)(arg4);                         \
11470ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[5] = (unsigned long)(arg5);                         \
11480ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[6] = (unsigned long)(arg6);                         \
11490ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
11504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
115187a287b47f496063f5869dc5039a81baeb6a29aesewardj         "subl $8, %%esp\n\t"                                     \
11520ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 24(%%eax)\n\t"                                    \
11530ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 20(%%eax)\n\t"                                    \
11540ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 16(%%eax)\n\t"                                    \
11550ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 12(%%eax)\n\t"                                    \
11560ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 8(%%eax)\n\t"                                     \
11570ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 4(%%eax)\n\t"                                     \
11580ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
11590ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_CALL_NOREDIR_EAX                                \
11604118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
11610ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=a" (_res)                                  \
11620ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "a" (&_argvec[0])                            \
11634118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
11640ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
11650ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
11660ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
11670ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
116866226cc1e5e852de3584c76984dace8679730b42sewardj#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
116966226cc1e5e852de3584c76984dace8679730b42sewardj                                 arg7)                            \
11700ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
117166226cc1e5e852de3584c76984dace8679730b42sewardj      volatile OrigFn        _orig = (orig);                      \
11720ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[8];                          \
11730ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
117466226cc1e5e852de3584c76984dace8679730b42sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
11750ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)(arg1);                         \
11760ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[2] = (unsigned long)(arg2);                         \
11770ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[3] = (unsigned long)(arg3);                         \
11780ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[4] = (unsigned long)(arg4);                         \
11790ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[5] = (unsigned long)(arg5);                         \
11800ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[6] = (unsigned long)(arg6);                         \
11810ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[7] = (unsigned long)(arg7);                         \
11820ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
11834118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
118487a287b47f496063f5869dc5039a81baeb6a29aesewardj         "subl $4, %%esp\n\t"                                     \
11850ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 28(%%eax)\n\t"                                    \
11860ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 24(%%eax)\n\t"                                    \
11870ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 20(%%eax)\n\t"                                    \
11880ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 16(%%eax)\n\t"                                    \
11890ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 12(%%eax)\n\t"                                    \
11900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 8(%%eax)\n\t"                                     \
11910ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 4(%%eax)\n\t"                                     \
11920ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
11930ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_CALL_NOREDIR_EAX                                \
11944118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
11950ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=a" (_res)                                  \
11960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "a" (&_argvec[0])                            \
11974118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
11980ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
11990ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
12000ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
12010ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
120266226cc1e5e852de3584c76984dace8679730b42sewardj#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
120366226cc1e5e852de3584c76984dace8679730b42sewardj                                 arg7,arg8)                       \
12040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
120566226cc1e5e852de3584c76984dace8679730b42sewardj      volatile OrigFn        _orig = (orig);                      \
12060ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[9];                          \
12070ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
120866226cc1e5e852de3584c76984dace8679730b42sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
12090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)(arg1);                         \
12100ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[2] = (unsigned long)(arg2);                         \
12110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[3] = (unsigned long)(arg3);                         \
12120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[4] = (unsigned long)(arg4);                         \
12130ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[5] = (unsigned long)(arg5);                         \
12140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[6] = (unsigned long)(arg6);                         \
12150ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[7] = (unsigned long)(arg7);                         \
12160ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[8] = (unsigned long)(arg8);                         \
12170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
12184118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
12190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 32(%%eax)\n\t"                                    \
12200ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 28(%%eax)\n\t"                                    \
12210ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 24(%%eax)\n\t"                                    \
12220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 20(%%eax)\n\t"                                    \
12230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 16(%%eax)\n\t"                                    \
12240ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 12(%%eax)\n\t"                                    \
12250ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 8(%%eax)\n\t"                                     \
12260ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 4(%%eax)\n\t"                                     \
12270ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
12280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_CALL_NOREDIR_EAX                                \
12294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
12300ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=a" (_res)                                  \
12310ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "a" (&_argvec[0])                            \
12324118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
12330ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
12340ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
12350ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
12360ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
123745fa5b0cef1884f5025e64401a1443d3e129ed5esewardj#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
123845fa5b0cef1884f5025e64401a1443d3e129ed5esewardj                                 arg7,arg8,arg9)                  \
123945fa5b0cef1884f5025e64401a1443d3e129ed5esewardj   do {                                                           \
124045fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      volatile OrigFn        _orig = (orig);                      \
124145fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      volatile unsigned long _argvec[10];                         \
124245fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      volatile unsigned long _res;                                \
124345fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
124445fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[1] = (unsigned long)(arg1);                         \
124545fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[2] = (unsigned long)(arg2);                         \
124645fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[3] = (unsigned long)(arg3);                         \
124745fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[4] = (unsigned long)(arg4);                         \
124845fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[5] = (unsigned long)(arg5);                         \
124945fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[6] = (unsigned long)(arg6);                         \
125045fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[7] = (unsigned long)(arg7);                         \
125145fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[8] = (unsigned long)(arg8);                         \
125245fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[9] = (unsigned long)(arg9);                         \
125345fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      __asm__ volatile(                                           \
12544118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
125587a287b47f496063f5869dc5039a81baeb6a29aesewardj         "subl $12, %%esp\n\t"                                    \
125645fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 36(%%eax)\n\t"                                    \
125745fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 32(%%eax)\n\t"                                    \
125845fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 28(%%eax)\n\t"                                    \
125945fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 24(%%eax)\n\t"                                    \
126045fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 20(%%eax)\n\t"                                    \
126145fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 16(%%eax)\n\t"                                    \
126245fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 12(%%eax)\n\t"                                    \
126345fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 8(%%eax)\n\t"                                     \
126445fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 4(%%eax)\n\t"                                     \
126545fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
126645fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         VALGRIND_CALL_NOREDIR_EAX                                \
12674118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
126845fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         : /*out*/   "=a" (_res)                                  \
126945fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         : /*in*/    "a" (&_argvec[0])                            \
12704118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
127145fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      );                                                          \
127245fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      lval = (__typeof__(lval)) _res;                             \
127345fa5b0cef1884f5025e64401a1443d3e129ed5esewardj   } while (0)
127445fa5b0cef1884f5025e64401a1443d3e129ed5esewardj
127545fa5b0cef1884f5025e64401a1443d3e129ed5esewardj#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
127645fa5b0cef1884f5025e64401a1443d3e129ed5esewardj                                  arg7,arg8,arg9,arg10)           \
127745fa5b0cef1884f5025e64401a1443d3e129ed5esewardj   do {                                                           \
127845fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      volatile OrigFn        _orig = (orig);                      \
127945fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      volatile unsigned long _argvec[11];                         \
128045fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      volatile unsigned long _res;                                \
128145fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
128245fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[1] = (unsigned long)(arg1);                         \
128345fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[2] = (unsigned long)(arg2);                         \
128445fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[3] = (unsigned long)(arg3);                         \
128545fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[4] = (unsigned long)(arg4);                         \
128645fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[5] = (unsigned long)(arg5);                         \
128745fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[6] = (unsigned long)(arg6);                         \
128845fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[7] = (unsigned long)(arg7);                         \
128945fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[8] = (unsigned long)(arg8);                         \
129045fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[9] = (unsigned long)(arg9);                         \
129145fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      _argvec[10] = (unsigned long)(arg10);                       \
129245fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      __asm__ volatile(                                           \
12934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
129487a287b47f496063f5869dc5039a81baeb6a29aesewardj         "subl $8, %%esp\n\t"                                     \
129545fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 40(%%eax)\n\t"                                    \
129645fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 36(%%eax)\n\t"                                    \
129745fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 32(%%eax)\n\t"                                    \
129845fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 28(%%eax)\n\t"                                    \
129945fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 24(%%eax)\n\t"                                    \
130045fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 20(%%eax)\n\t"                                    \
130145fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 16(%%eax)\n\t"                                    \
130245fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 12(%%eax)\n\t"                                    \
130345fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 8(%%eax)\n\t"                                     \
130445fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "pushl 4(%%eax)\n\t"                                     \
130545fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
130645fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         VALGRIND_CALL_NOREDIR_EAX                                \
13074118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
130845fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         : /*out*/   "=a" (_res)                                  \
130945fa5b0cef1884f5025e64401a1443d3e129ed5esewardj         : /*in*/    "a" (&_argvec[0])                            \
13104118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
131145fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      );                                                          \
131245fa5b0cef1884f5025e64401a1443d3e129ed5esewardj      lval = (__typeof__(lval)) _res;                             \
131345fa5b0cef1884f5025e64401a1443d3e129ed5esewardj   } while (0)
131445fa5b0cef1884f5025e64401a1443d3e129ed5esewardj
13155ce4b150ce5d32c9af07a24717081ea34568388asewardj#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
13165ce4b150ce5d32c9af07a24717081ea34568388asewardj                                  arg6,arg7,arg8,arg9,arg10,      \
13175ce4b150ce5d32c9af07a24717081ea34568388asewardj                                  arg11)                          \
13185ce4b150ce5d32c9af07a24717081ea34568388asewardj   do {                                                           \
13195ce4b150ce5d32c9af07a24717081ea34568388asewardj      volatile OrigFn        _orig = (orig);                      \
13205ce4b150ce5d32c9af07a24717081ea34568388asewardj      volatile unsigned long _argvec[12];                         \
13215ce4b150ce5d32c9af07a24717081ea34568388asewardj      volatile unsigned long _res;                                \
13225ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
13235ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[1] = (unsigned long)(arg1);                         \
13245ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[2] = (unsigned long)(arg2);                         \
13255ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[3] = (unsigned long)(arg3);                         \
13265ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[4] = (unsigned long)(arg4);                         \
13275ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[5] = (unsigned long)(arg5);                         \
13285ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[6] = (unsigned long)(arg6);                         \
13295ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[7] = (unsigned long)(arg7);                         \
13305ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[8] = (unsigned long)(arg8);                         \
13315ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[9] = (unsigned long)(arg9);                         \
13325ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[10] = (unsigned long)(arg10);                       \
13335ce4b150ce5d32c9af07a24717081ea34568388asewardj      _argvec[11] = (unsigned long)(arg11);                       \
13345ce4b150ce5d32c9af07a24717081ea34568388asewardj      __asm__ volatile(                                           \
13354118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
133687a287b47f496063f5869dc5039a81baeb6a29aesewardj         "subl $4, %%esp\n\t"                                     \
13375ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 44(%%eax)\n\t"                                    \
13385ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 40(%%eax)\n\t"                                    \
13395ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 36(%%eax)\n\t"                                    \
13405ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 32(%%eax)\n\t"                                    \
13415ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 28(%%eax)\n\t"                                    \
13425ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 24(%%eax)\n\t"                                    \
13435ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 20(%%eax)\n\t"                                    \
13445ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 16(%%eax)\n\t"                                    \
13455ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 12(%%eax)\n\t"                                    \
13465ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 8(%%eax)\n\t"                                     \
13475ce4b150ce5d32c9af07a24717081ea34568388asewardj         "pushl 4(%%eax)\n\t"                                     \
13485ce4b150ce5d32c9af07a24717081ea34568388asewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
13495ce4b150ce5d32c9af07a24717081ea34568388asewardj         VALGRIND_CALL_NOREDIR_EAX                                \
13504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
13515ce4b150ce5d32c9af07a24717081ea34568388asewardj         : /*out*/   "=a" (_res)                                  \
13525ce4b150ce5d32c9af07a24717081ea34568388asewardj         : /*in*/    "a" (&_argvec[0])                            \
13534118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
13545ce4b150ce5d32c9af07a24717081ea34568388asewardj      );                                                          \
13555ce4b150ce5d32c9af07a24717081ea34568388asewardj      lval = (__typeof__(lval)) _res;                             \
13565ce4b150ce5d32c9af07a24717081ea34568388asewardj   } while (0)
13575ce4b150ce5d32c9af07a24717081ea34568388asewardj
135866226cc1e5e852de3584c76984dace8679730b42sewardj#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
135966226cc1e5e852de3584c76984dace8679730b42sewardj                                  arg6,arg7,arg8,arg9,arg10,      \
136066226cc1e5e852de3584c76984dace8679730b42sewardj                                  arg11,arg12)                    \
13610ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
136266226cc1e5e852de3584c76984dace8679730b42sewardj      volatile OrigFn        _orig = (orig);                      \
13630ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[13];                         \
13640ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
136566226cc1e5e852de3584c76984dace8679730b42sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
13660ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)(arg1);                         \
13670ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[2] = (unsigned long)(arg2);                         \
13680ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[3] = (unsigned long)(arg3);                         \
13690ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[4] = (unsigned long)(arg4);                         \
13700ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[5] = (unsigned long)(arg5);                         \
13710ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[6] = (unsigned long)(arg6);                         \
13720ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[7] = (unsigned long)(arg7);                         \
13730ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[8] = (unsigned long)(arg8);                         \
13740ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[9] = (unsigned long)(arg9);                         \
13750ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[10] = (unsigned long)(arg10);                       \
13760ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[11] = (unsigned long)(arg11);                       \
13770ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[12] = (unsigned long)(arg12);                       \
13780ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
13794118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
13800ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 48(%%eax)\n\t"                                    \
13810ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 44(%%eax)\n\t"                                    \
13820ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 40(%%eax)\n\t"                                    \
13830ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 36(%%eax)\n\t"                                    \
13840ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 32(%%eax)\n\t"                                    \
13850ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 28(%%eax)\n\t"                                    \
13860ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 24(%%eax)\n\t"                                    \
13870ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 20(%%eax)\n\t"                                    \
13880ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 16(%%eax)\n\t"                                    \
13890ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 12(%%eax)\n\t"                                    \
13900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 8(%%eax)\n\t"                                     \
13910ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "pushl 4(%%eax)\n\t"                                     \
13920ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
13930ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_CALL_NOREDIR_EAX                                \
13944118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
13950ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=a" (_res)                                  \
13960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "a" (&_argvec[0])                            \
13974118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
13980ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
13990ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
14000ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
14010ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
1402f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif /* PLAT_x86_linux || PLAT_x86_darwin */
14030ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
1404f76d27a697a7b0bf3b84490baf60623fc96a23afnjn/* ------------------------ amd64-{linux,darwin} --------------- */
14050ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
1406f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin)
14070ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
14080ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */
14090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
14100ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* These regs are trashed by the hidden call. */
14110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi",       \
14120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                            "rdi", "r8", "r9", "r10", "r11"
14130ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
1414dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj/* This is all pretty complex.  It's so as to make stack unwinding
1415dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   work reliably.  See bug 243270.  The basic problem is the sub and
1416dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   add of 128 of %rsp in all of the following macros.  If gcc believes
1417dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   the CFA is in %rsp, then unwinding may fail, because what's at the
1418dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   CFA is not what gcc "expected" when it constructs the CFIs for the
1419dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   places where the macros are instantiated.
1420dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj
1421dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   But we can't just add a CFI annotation to increase the CFA offset
1422dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   by 128, to match the sub of 128 from %rsp, because we don't know
1423dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   whether gcc has chosen %rsp as the CFA at that point, or whether it
1424dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   has chosen some other register (eg, %rbp).  In the latter case,
1425dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   adding a CFI annotation to change the CFA offset is simply wrong.
1426dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj
1427dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   So the solution is to get hold of the CFA using
14288d1dc150a77fe495682a928949c5d5b7443b045csewardj   __builtin_dwarf_cfa(), put it in a known register, and add a
1429dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   CFI annotation to say what the register is.  We choose %rbp for
1430dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   this (perhaps perversely), because:
1431dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj
1432dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   (1) %rbp is already subject to unwinding.  If a new register was
1433dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj       chosen then the unwinder would have to unwind it in all stack
1434dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj       traces, which is expensive, and
1435dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj
1436dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   (2) %rbp is already subject to precise exception updates in the
1437dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj       JIT.  If a new register was chosen, we'd have to have precise
1438dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj       exceptions for it too, which reduces performance of the
1439dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj       generated code.
1440dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj
1441dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   However .. one extra complication.  We can't just whack the result
14428d1dc150a77fe495682a928949c5d5b7443b045csewardj   of __builtin_dwarf_cfa() into %rbp and then add %rbp to the
1443dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   list of trashed registers at the end of the inline assembly
1444dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   fragments; gcc won't allow %rbp to appear in that list.  Hence
1445dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   instead we need to stash %rbp in %r15 for the duration of the asm,
1446dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   and say that %r15 is trashed instead.  gcc seems happy to go with
1447dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   that.
1448dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj
1449dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   Oh .. and this all needs to be conditionalised so that it is
1450dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj   unchanged from before this commit, when compiled with older gccs
14518d1dc150a77fe495682a928949c5d5b7443b045csewardj   that don't support __builtin_dwarf_cfa.  Furthermore, since
14528d1dc150a77fe495682a928949c5d5b7443b045csewardj   this header file is freestanding, it has to be independent of
14538d1dc150a77fe495682a928949c5d5b7443b045csewardj   config.h, and so the following conditionalisation cannot depend on
14548d1dc150a77fe495682a928949c5d5b7443b045csewardj   configure time checks.
14558d1dc150a77fe495682a928949c5d5b7443b045csewardj
14568d1dc150a77fe495682a928949c5d5b7443b045csewardj   Although it's not clear from
14578d1dc150a77fe495682a928949c5d5b7443b045csewardj   'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)',
14588d1dc150a77fe495682a928949c5d5b7443b045csewardj   this expression excludes Darwin.
14598d1dc150a77fe495682a928949c5d5b7443b045csewardj   .cfi directives in Darwin assembly appear to be completely
14608d1dc150a77fe495682a928949c5d5b7443b045csewardj   different and I haven't investigated how they work.
14618d1dc150a77fe495682a928949c5d5b7443b045csewardj
14628d1dc150a77fe495682a928949c5d5b7443b045csewardj   For even more entertainment value, note we have to use the
14638d1dc150a77fe495682a928949c5d5b7443b045csewardj   completely undocumented __builtin_dwarf_cfa(), which appears to
14648d1dc150a77fe495682a928949c5d5b7443b045csewardj   really compute the CFA, whereas __builtin_frame_address(0) claims
14658d1dc150a77fe495682a928949c5d5b7443b045csewardj   to but actually doesn't.  See
14668d1dc150a77fe495682a928949c5d5b7443b045csewardj   https://bugs.kde.org/show_bug.cgi?id=243270#c47
1467dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj*/
14688d1dc150a77fe495682a928949c5d5b7443b045csewardj#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
1469dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj#  define __FRAME_POINTER                                         \
14708d1dc150a77fe495682a928949c5d5b7443b045csewardj      ,"r"(__builtin_dwarf_cfa())
1471dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj#  define VALGRIND_CFI_PROLOGUE                                   \
1472dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj      "movq %%rbp, %%r15\n\t"                                     \
14738d1dc150a77fe495682a928949c5d5b7443b045csewardj      "movq %2, %%rbp\n\t"                                        \
14748d1dc150a77fe495682a928949c5d5b7443b045csewardj      ".cfi_remember_state\n\t"                                   \
1475dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj      ".cfi_def_cfa rbp, 0\n\t"
1476dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj#  define VALGRIND_CFI_EPILOGUE                                   \
1477dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj      "movq %%r15, %%rbp\n\t"                                     \
1478dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj      ".cfi_restore_state\n\t"
1479dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj#else
1480dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj#  define __FRAME_POINTER
1481dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj#  define VALGRIND_CFI_PROLOGUE
1482dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj#  define VALGRIND_CFI_EPILOGUE
1483dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj#endif
1484dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj
14854118e0f0df0468b3eccf2515d13c3d9c478d6f16tom/* Macros to save and align the stack before making a function
14864118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   call and restore it afterwards as gcc may not keep the stack
14874118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   pointer aligned if it doesn't realise calls are being made
14884118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   to other functions. */
14894118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
14904118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_ALIGN_STACK               \
14914118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "movq %%rsp,%%r14\n\t"               \
14924118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "andq $0xfffffffffffffff0,%%rsp\n\t"
14934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_RESTORE_STACK             \
14944118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "movq %%r14,%%rsp\n\t"
1495dfa55cf5263d1a105425fef13aff164e8cbb30f6sewardj
14960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned
14970ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   long) == 8. */
14980ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
1499a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj/* NB 9 Sept 07.  There is a nasty kludge here in all these CALL_FN_
1500a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   macros.  In order not to trash the stack redzone, we need to drop
1501a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   %rsp by 128 before the hidden call, and restore afterwards.  The
1502a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   nastyness is that it is only by luck that the stack still appears
1503a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   to be unwindable during the hidden call - since then the behaviour
1504a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   of any routine using this macro does not match what the CFI data
1505a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   says.  Sigh.
1506a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj
1507a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   Why is this important?  Imagine that a wrapper has a stack
1508a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   allocated local, and passes to the hidden call, a pointer to it.
1509a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   Because gcc does not know about the hidden call, it may allocate
1510a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   that local in the redzone.  Unfortunately the hidden call may then
1511a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   trash it before it comes to use it.  So we must step clear of the
1512a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   redzone, for the duration of the hidden call, to make it safe.
1513a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj
1514a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   Probably the same problem afflicts the other redzone-style ABIs too
15156e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj   (ppc64-linux); but for those, the stack is
1516a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   self describing (none of this CFI nonsense) so at least messing
1517a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   with the stack pointer doesn't give a danger of non-unwindable
1518a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj   stack. */
1519a07c2e157185dc577d6fa5fa154a44e4b3afe185sewardj
15204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_v(lval, orig)                                        \
15214118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
15224118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
15234118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[1];                               \
15244118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
15254118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
15264118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
15274118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
15284118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
15294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
15304118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
15314118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
15324118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
15334118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
15344118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
15354118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
15364118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
15374118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
15384118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
15394118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
15404118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
15414118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_W(lval, orig, arg1)                                  \
15424118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
15434118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
15444118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[2];                               \
15454118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
15464118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
15474118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
15484118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
15494118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
15504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
15514118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
15524118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
15534118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
15544118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
15554118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
15564118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
15574118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
15584118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
15594118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
15604118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
15614118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
15624118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
15634118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
15644118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_WW(lval, orig, arg1,arg2)                            \
15654118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
15664118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
15674118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[3];                               \
15684118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
15694118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
15704118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
15714118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
15724118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
15734118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
15744118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
15754118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
15764118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
15774118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
15784118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
15794118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
15804118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
15814118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
15824118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
15834118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
15844118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
15854118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
15864118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
15874118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
15884118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
15894118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                      \
15904118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
15914118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
15924118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[4];                               \
15934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
15944118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
15954118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
15964118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
15974118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
15984118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
15994118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
16004118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
16014118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
16024118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
16034118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
16044118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
16054118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
16064118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
16074118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
16084118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
16094118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
16104118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
16114118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
16124118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
16134118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
16144118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
16154118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
16164118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)                \
16174118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
16184118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
16194118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[5];                               \
16204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
16214118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
16224118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
16234118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
16244118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
16254118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[4] = (unsigned long)(arg4);                              \
16264118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
16274118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
16284118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
16294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
16304118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 32(%%rax), %%rcx\n\t"                                   \
16314118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
16324118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
16334118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
16344118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
16354118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
16364118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
16374118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
16384118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
16394118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
16404118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
16414118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
16424118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
16434118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
16444118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
16454118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)             \
16464118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
16474118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
16484118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[6];                               \
16494118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
16504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
16514118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
16524118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
16534118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
16544118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[4] = (unsigned long)(arg4);                              \
16554118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[5] = (unsigned long)(arg5);                              \
16564118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
16574118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
16584118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
16594118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
16604118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 40(%%rax), %%r8\n\t"                                    \
16614118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 32(%%rax), %%rcx\n\t"                                   \
16624118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
16634118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
16644118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
16654118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
16664118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
16674118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
16684118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
16694118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
16704118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
16714118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
16724118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
16734118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
16744118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
16754118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
16764118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)        \
16774118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
16784118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
16794118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[7];                               \
16804118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
16814118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
16824118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
16834118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
16844118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
16854118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[4] = (unsigned long)(arg4);                              \
16864118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[5] = (unsigned long)(arg5);                              \
16874118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[6] = (unsigned long)(arg6);                              \
16884118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
16894118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
16904118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
16914118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
16924118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 48(%%rax), %%r9\n\t"                                    \
16934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 40(%%rax), %%r8\n\t"                                    \
16944118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 32(%%rax), %%rcx\n\t"                                   \
16954118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
16964118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
16974118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
16984118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
16994118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
17004118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
17014118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
17024118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
17034118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
17044118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
17054118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
17064118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
17074118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
17084118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
17094118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,        \
17104118e0f0df0468b3eccf2515d13c3d9c478d6f16tom                                 arg7)                                 \
17114118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
17124118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
17134118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[8];                               \
17144118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
17154118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
17164118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
17174118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
17184118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
17194118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[4] = (unsigned long)(arg4);                              \
17204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[5] = (unsigned long)(arg5);                              \
17214118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[6] = (unsigned long)(arg6);                              \
17224118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[7] = (unsigned long)(arg7);                              \
17234118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
17244118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
17254118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
17264118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $136,%%rsp\n\t"                                         \
17274118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 56(%%rax)\n\t"                                         \
17284118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 48(%%rax), %%r9\n\t"                                    \
17294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 40(%%rax), %%r8\n\t"                                    \
17304118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 32(%%rax), %%rcx\n\t"                                   \
17314118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
17324118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
17334118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
17344118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
17354118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
17364118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
17374118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
17384118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
17394118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
17404118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
17414118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
17424118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
17434118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
17444118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
17454118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,        \
17464118e0f0df0468b3eccf2515d13c3d9c478d6f16tom                                 arg7,arg8)                            \
17474118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
17484118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
17494118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[9];                               \
17504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
17514118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
17524118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
17534118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
17544118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
17554118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[4] = (unsigned long)(arg4);                              \
17564118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[5] = (unsigned long)(arg5);                              \
17574118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[6] = (unsigned long)(arg6);                              \
17584118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[7] = (unsigned long)(arg7);                              \
17594118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[8] = (unsigned long)(arg8);                              \
17604118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
17614118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
17624118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
17634118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
17644118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 64(%%rax)\n\t"                                         \
17654118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 56(%%rax)\n\t"                                         \
17664118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 48(%%rax), %%r9\n\t"                                    \
17674118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 40(%%rax), %%r8\n\t"                                    \
17684118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 32(%%rax), %%rcx\n\t"                                   \
17694118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
17704118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
17714118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
17724118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
17734118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
17744118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
17754118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
17764118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
17774118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
17784118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
17794118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
17804118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
17814118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
17824118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
17834118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,        \
17844118e0f0df0468b3eccf2515d13c3d9c478d6f16tom                                 arg7,arg8,arg9)                       \
17854118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
17864118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
17874118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[10];                              \
17884118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
17894118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
17904118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
17914118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
17924118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
17934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[4] = (unsigned long)(arg4);                              \
17944118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[5] = (unsigned long)(arg5);                              \
17954118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[6] = (unsigned long)(arg6);                              \
17964118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[7] = (unsigned long)(arg7);                              \
17974118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[8] = (unsigned long)(arg8);                              \
17984118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[9] = (unsigned long)(arg9);                              \
17994118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
18004118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
18014118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
18024118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $136,%%rsp\n\t"                                         \
18034118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 72(%%rax)\n\t"                                         \
18044118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 64(%%rax)\n\t"                                         \
18054118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 56(%%rax)\n\t"                                         \
18064118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 48(%%rax), %%r9\n\t"                                    \
18074118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 40(%%rax), %%r8\n\t"                                    \
18084118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 32(%%rax), %%rcx\n\t"                                   \
18094118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
18104118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
18114118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
18124118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
18134118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
18144118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
18154118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
18164118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
18174118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
18184118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
18194118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
18204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
18214118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
18224118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
18234118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,       \
18244118e0f0df0468b3eccf2515d13c3d9c478d6f16tom                                  arg7,arg8,arg9,arg10)                \
18254118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
18264118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
18274118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[11];                              \
18284118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
18294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
18304118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
18314118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
18324118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
18334118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[4] = (unsigned long)(arg4);                              \
18344118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[5] = (unsigned long)(arg5);                              \
18354118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[6] = (unsigned long)(arg6);                              \
18364118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[7] = (unsigned long)(arg7);                              \
18374118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[8] = (unsigned long)(arg8);                              \
18384118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[9] = (unsigned long)(arg9);                              \
18394118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[10] = (unsigned long)(arg10);                            \
18404118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
18414118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
18424118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
18434118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
18444118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 80(%%rax)\n\t"                                         \
18454118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 72(%%rax)\n\t"                                         \
18464118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 64(%%rax)\n\t"                                         \
18474118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 56(%%rax)\n\t"                                         \
18484118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 48(%%rax), %%r9\n\t"                                    \
18494118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 40(%%rax), %%r8\n\t"                                    \
18504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 32(%%rax), %%rcx\n\t"                                   \
18514118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
18524118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
18534118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
18544118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
18554118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
18564118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
18574118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
18584118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
18594118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
18604118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
18614118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
18624118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
18634118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
18644118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
18654118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,       \
18664118e0f0df0468b3eccf2515d13c3d9c478d6f16tom                                  arg7,arg8,arg9,arg10,arg11)          \
18674118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
18684118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
18694118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[12];                              \
18704118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
18714118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
18724118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
18734118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
18744118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
18754118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[4] = (unsigned long)(arg4);                              \
18764118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[5] = (unsigned long)(arg5);                              \
18774118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[6] = (unsigned long)(arg6);                              \
18784118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[7] = (unsigned long)(arg7);                              \
18794118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[8] = (unsigned long)(arg8);                              \
18804118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[9] = (unsigned long)(arg9);                              \
18814118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[10] = (unsigned long)(arg10);                            \
18824118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[11] = (unsigned long)(arg11);                            \
18834118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
18844118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
18854118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
18864118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $136,%%rsp\n\t"                                         \
18874118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 88(%%rax)\n\t"                                         \
18884118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 80(%%rax)\n\t"                                         \
18894118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 72(%%rax)\n\t"                                         \
18904118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 64(%%rax)\n\t"                                         \
18914118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 56(%%rax)\n\t"                                         \
18924118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 48(%%rax), %%r9\n\t"                                    \
18934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 40(%%rax), %%r8\n\t"                                    \
18944118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 32(%%rax), %%rcx\n\t"                                   \
18954118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
18964118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
18974118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
18984118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
18994118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
19004118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
19014118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
19024118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
19034118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
19044118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
19054118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
19064118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
19074118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   } while (0)
19084118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
19094118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,       \
19104118e0f0df0468b3eccf2515d13c3d9c478d6f16tom                                arg7,arg8,arg9,arg10,arg11,arg12)      \
19114118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   do {                                                                \
19124118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile OrigFn        _orig = (orig);                           \
19134118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _argvec[13];                              \
19144118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      volatile unsigned long _res;                                     \
19154118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[0] = (unsigned long)_orig.nraddr;                        \
19164118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[1] = (unsigned long)(arg1);                              \
19174118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[2] = (unsigned long)(arg2);                              \
19184118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[3] = (unsigned long)(arg3);                              \
19194118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[4] = (unsigned long)(arg4);                              \
19204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[5] = (unsigned long)(arg5);                              \
19214118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[6] = (unsigned long)(arg6);                              \
19224118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[7] = (unsigned long)(arg7);                              \
19234118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[8] = (unsigned long)(arg8);                              \
19244118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[9] = (unsigned long)(arg9);                              \
19254118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[10] = (unsigned long)(arg10);                            \
19264118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[11] = (unsigned long)(arg11);                            \
19274118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      _argvec[12] = (unsigned long)(arg12);                            \
19284118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      __asm__ volatile(                                                \
19294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_PROLOGUE                                         \
19304118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                          \
19314118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "subq $128,%%rsp\n\t"                                         \
19324118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 96(%%rax)\n\t"                                         \
19334118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 88(%%rax)\n\t"                                         \
19344118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 80(%%rax)\n\t"                                         \
19354118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 72(%%rax)\n\t"                                         \
19364118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 64(%%rax)\n\t"                                         \
19374118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "pushq 56(%%rax)\n\t"                                         \
19384118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 48(%%rax), %%r9\n\t"                                    \
19394118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 40(%%rax), %%r8\n\t"                                    \
19404118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 32(%%rax), %%rcx\n\t"                                   \
19414118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 24(%%rax), %%rdx\n\t"                                   \
19424118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 16(%%rax), %%rsi\n\t"                                   \
19434118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq 8(%%rax), %%rdi\n\t"                                    \
19444118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
19454118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CALL_NOREDIR_RAX                                     \
19464118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                        \
19474118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_CFI_EPILOGUE                                         \
19484118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*out*/   "=a" (_res)                                       \
19494118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
19504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
19514118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      );                                                               \
19524118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      lval = (__typeof__(lval)) _res;                                  \
1953a50f9dcb3a7609e10047a4c6dfa3eb7363088bd2sewardj   } while (0)
1954a50f9dcb3a7609e10047a4c6dfa3eb7363088bd2sewardj
1955f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
19560ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
1957f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj/* ------------------------ ppc32-linux ------------------------ */
19580ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
1959f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#if defined(PLAT_ppc32_linux)
19600ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
1961ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj/* This is useful for finding out about the on-stack stuff:
1962ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
1963ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   extern int f9  ( int,int,int,int,int,int,int,int,int );
1964ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   extern int f10 ( int,int,int,int,int,int,int,int,int,int );
1965ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   extern int f11 ( int,int,int,int,int,int,int,int,int,int,int );
1966ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int );
1967ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
1968ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   int g9 ( void ) {
1969ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      return f9(11,22,33,44,55,66,77,88,99);
1970ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   }
1971ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   int g10 ( void ) {
1972ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      return f10(11,22,33,44,55,66,77,88,99,110);
1973ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   }
1974ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   int g11 ( void ) {
1975ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      return f11(11,22,33,44,55,66,77,88,99,110,121);
1976ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   }
1977ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   int g12 ( void ) {
1978ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      return f12(11,22,33,44,55,66,77,88,99,110,121,132);
1979ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   }
1980ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj*/
1981ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
19820ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
19830ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
19840ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* These regs are trashed by the hidden call. */
1985ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define __CALLER_SAVED_REGS                                       \
1986ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   "lr", "ctr", "xer",                                            \
1987ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
1988ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
1989ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   "r11", "r12", "r13"
19900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
19914118e0f0df0468b3eccf2515d13c3d9c478d6f16tom/* Macros to save and align the stack before making a function
19924118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   call and restore it afterwards as gcc may not keep the stack
19934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   pointer aligned if it doesn't realise calls are being made
19944118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   to other functions. */
19954118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
19964118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_ALIGN_STACK               \
19974118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "mr 28,1\n\t"                        \
19984118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "rlwinm 1,1,0,0,27\n\t"
19994118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_RESTORE_STACK             \
20004118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "mr 1,28\n\t"
20014118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
2002ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj/* These CALL_FN_ macros assume that on ppc32-linux,
2003ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   sizeof(unsigned long) == 4. */
20040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
200538de0994e3561760a8e1ff2efd51a0c9217a3d8dsewardj#define CALL_FN_W_v(lval, orig)                                   \
20060ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
2007d68ac3e974d25f88492774f6baa491999afde9f9sewardj      volatile OrigFn        _orig = (orig);                      \
20080ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[1];                          \
20090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
2010d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
20110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
20124118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
20130ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "mr 11,%1\n\t"                                           \
20140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
20150ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
20164118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
20170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "mr %0,3"                                                \
20180ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=r" (_res)                                  \
20190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "r" (&_argvec[0])                            \
20204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
20210ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
20220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
20230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
20240ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
202538de0994e3561760a8e1ff2efd51a0c9217a3d8dsewardj#define CALL_FN_W_W(lval, orig, arg1)                             \
20260ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
202738de0994e3561760a8e1ff2efd51a0c9217a3d8dsewardj      volatile OrigFn        _orig = (orig);                      \
20280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[2];                          \
20290ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
203038de0994e3561760a8e1ff2efd51a0c9217a3d8dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
20310ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)arg1;                           \
20320ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
20334118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
20340ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "mr 11,%1\n\t"                                           \
20350ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
20360ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
20370ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
20384118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
20390ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "mr %0,3"                                                \
20400ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=r" (_res)                                  \
20410ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "r" (&_argvec[0])                            \
20424118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
20430ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
20440ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
20450ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
20460ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
204738de0994e3561760a8e1ff2efd51a0c9217a3d8dsewardj#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
20480ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   do {                                                           \
204938de0994e3561760a8e1ff2efd51a0c9217a3d8dsewardj      volatile OrigFn        _orig = (orig);                      \
20500ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _argvec[3];                          \
20510ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      volatile unsigned long _res;                                \
205238de0994e3561760a8e1ff2efd51a0c9217a3d8dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
20530ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[1] = (unsigned long)arg1;                           \
20540ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      _argvec[2] = (unsigned long)arg2;                           \
20550ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      __asm__ volatile(                                           \
20564118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
20570ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "mr 11,%1\n\t"                                           \
20580ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
20590ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "lwz 4,8(11)\n\t"                                        \
20600ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
20610ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
20624118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
20630ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         "mr %0,3"                                                \
20640ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*out*/   "=r" (_res)                                  \
20650ec07f32bbbb209d749b9974408e6f025ad40b31sewardj         : /*in*/    "r" (&_argvec[0])                            \
20664118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
20670ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      );                                                          \
20680ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      lval = (__typeof__(lval)) _res;                             \
20690ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   } while (0)
20700ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
2071ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
2072ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2073ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2074ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[4];                          \
2075ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2076ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2077ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2078ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2079ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2080ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
20814118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2082ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2083ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2084ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2085ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2086ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2087ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
20884118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2089ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2090ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2091ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
20924118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2093ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2094ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2095ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2096ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2097ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
2098ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2099ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2100ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[5];                          \
2101ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2102ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2103ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2104ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2105ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2106ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[4] = (unsigned long)arg4;                           \
2107ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
21084118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2109ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2110ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2111ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2112ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2113ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2114ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2115ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
21164118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2117ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2118ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2119ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
21204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2121ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2122ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2123ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2124ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2125ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
2126ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2127ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2128ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[6];                          \
2129ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2130ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2131ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2132ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2133ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2134ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[4] = (unsigned long)arg4;                           \
2135ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[5] = (unsigned long)arg5;                           \
2136ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
21374118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2138ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2139ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2140ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2141ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2142ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2143ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 7,20(11)\n\t"                                       \
2144ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2145ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
21464118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2147ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2148ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2149ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
21504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2151ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2152ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2153ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2154ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2155ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
2156ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2157ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2158ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[7];                          \
2159ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2160ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2161ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2162ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2163ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2164ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[4] = (unsigned long)arg4;                           \
2165ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[5] = (unsigned long)arg5;                           \
2166ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[6] = (unsigned long)arg6;                           \
2167ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
21684118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2169ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2170ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2171ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2172ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2173ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2174ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 7,20(11)\n\t"                                       \
2175ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 8,24(11)\n\t"                                       \
2176ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2177ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
21784118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2179ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2180ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2181ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
21824118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2183ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2184ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2185ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2186ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2187ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2188ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj                                 arg7)                            \
2189ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2190ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2191ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[8];                          \
2192ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2193ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2194ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2195ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2196ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2197ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[4] = (unsigned long)arg4;                           \
2198ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[5] = (unsigned long)arg5;                           \
2199ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[6] = (unsigned long)arg6;                           \
2200ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[7] = (unsigned long)arg7;                           \
2201ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
22024118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2203ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2204ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2205ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2206ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2207ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2208ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 7,20(11)\n\t"                                       \
2209ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 8,24(11)\n\t"                                       \
2210ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 9,28(11)\n\t"                                       \
2211ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2212ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
22134118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2214ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2215ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2216ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
22174118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2218ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2219ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2220ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2221ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2222ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2223ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj                                 arg7,arg8)                       \
2224ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2225ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2226ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[9];                          \
2227ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2228ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2229ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2230ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2231ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2232ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[4] = (unsigned long)arg4;                           \
2233ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[5] = (unsigned long)arg5;                           \
2234ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[6] = (unsigned long)arg6;                           \
2235ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[7] = (unsigned long)arg7;                           \
2236ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[8] = (unsigned long)arg8;                           \
2237ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
22384118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2239ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2240ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2241ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2242ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2243ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2244ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 7,20(11)\n\t"                                       \
2245ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 8,24(11)\n\t"                                       \
2246ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 9,28(11)\n\t"                                       \
2247ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2248ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2249ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
22504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2251ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2252ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2253ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
22544118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2255ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2256ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2257ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2258ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2259ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2260ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj                                 arg7,arg8,arg9)                  \
2261ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2262ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2263ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[10];                         \
2264ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2265ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2266ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2267ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2268ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2269ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[4] = (unsigned long)arg4;                           \
2270ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[5] = (unsigned long)arg5;                           \
2271ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[6] = (unsigned long)arg6;                           \
2272ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[7] = (unsigned long)arg7;                           \
2273ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[8] = (unsigned long)arg8;                           \
2274ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[9] = (unsigned long)arg9;                           \
2275ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
22764118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2277ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2278ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "addi 1,1,-16\n\t"                                       \
2279ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg9 */                                               \
2280ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,36(11)\n\t"                                       \
2281ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,8(1)\n\t"                                         \
2282ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* args1-8 */                                            \
2283ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2284ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2285ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2286ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2287ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 7,20(11)\n\t"                                       \
2288ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 8,24(11)\n\t"                                       \
2289ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 9,28(11)\n\t"                                       \
2290ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2291ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2292ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
22934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2294ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2295ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2296ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
22974118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2298ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2299ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2300ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2301ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2302ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2303ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj                                  arg7,arg8,arg9,arg10)           \
2304ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2305ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2306ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[11];                         \
2307ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2308ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2309ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2310ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2311ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2312ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[4] = (unsigned long)arg4;                           \
2313ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[5] = (unsigned long)arg5;                           \
2314ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[6] = (unsigned long)arg6;                           \
2315ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[7] = (unsigned long)arg7;                           \
2316ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[8] = (unsigned long)arg8;                           \
2317ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[9] = (unsigned long)arg9;                           \
2318ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[10] = (unsigned long)arg10;                         \
2319ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
23204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2321ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2322ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "addi 1,1,-16\n\t"                                       \
2323ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg10 */                                              \
2324ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,40(11)\n\t"                                       \
2325ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,12(1)\n\t"                                        \
2326ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg9 */                                               \
2327ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,36(11)\n\t"                                       \
2328ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,8(1)\n\t"                                         \
2329ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* args1-8 */                                            \
2330ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2331ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2332ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2333ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2334ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 7,20(11)\n\t"                                       \
2335ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 8,24(11)\n\t"                                       \
2336ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 9,28(11)\n\t"                                       \
2337ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2338ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2339ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
23404118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2341ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2342ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2343ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
23444118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2345ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2346ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2347ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2348ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2349ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2350ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj                                  arg7,arg8,arg9,arg10,arg11)     \
2351ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2352ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2353ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[12];                         \
2354ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2355ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2356ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2357ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2358ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2359ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[4] = (unsigned long)arg4;                           \
2360ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[5] = (unsigned long)arg5;                           \
2361ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[6] = (unsigned long)arg6;                           \
2362ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[7] = (unsigned long)arg7;                           \
2363ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[8] = (unsigned long)arg8;                           \
2364ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[9] = (unsigned long)arg9;                           \
2365ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[10] = (unsigned long)arg10;                         \
2366ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[11] = (unsigned long)arg11;                         \
2367ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
23684118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2369ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2370ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "addi 1,1,-32\n\t"                                       \
2371ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg11 */                                              \
2372ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,44(11)\n\t"                                       \
2373ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,16(1)\n\t"                                        \
2374ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg10 */                                              \
2375ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,40(11)\n\t"                                       \
2376ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,12(1)\n\t"                                        \
2377ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg9 */                                               \
2378ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,36(11)\n\t"                                       \
2379ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,8(1)\n\t"                                         \
2380ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* args1-8 */                                            \
2381ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2382ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2383ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2384ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2385ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 7,20(11)\n\t"                                       \
2386ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 8,24(11)\n\t"                                       \
2387ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 9,28(11)\n\t"                                       \
2388ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2389ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2390ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
23914118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2392ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2393ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2394ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
23954118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2396ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2397ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2398ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2399ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2400ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2401ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj                                arg7,arg8,arg9,arg10,arg11,arg12) \
2402ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   do {                                                           \
2403ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile OrigFn        _orig = (orig);                      \
2404ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _argvec[13];                         \
2405ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      volatile unsigned long _res;                                \
2406ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
2407ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[1] = (unsigned long)arg1;                           \
2408ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[2] = (unsigned long)arg2;                           \
2409ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[3] = (unsigned long)arg3;                           \
2410ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[4] = (unsigned long)arg4;                           \
2411ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[5] = (unsigned long)arg5;                           \
2412ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[6] = (unsigned long)arg6;                           \
2413ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[7] = (unsigned long)arg7;                           \
2414ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[8] = (unsigned long)arg8;                           \
2415ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[9] = (unsigned long)arg9;                           \
2416ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[10] = (unsigned long)arg10;                         \
2417ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[11] = (unsigned long)arg11;                         \
2418ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      _argvec[12] = (unsigned long)arg12;                         \
2419ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      __asm__ volatile(                                           \
24204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2421ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr 11,%1\n\t"                                           \
2422ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "addi 1,1,-32\n\t"                                       \
2423ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg12 */                                              \
2424ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,48(11)\n\t"                                       \
2425ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,20(1)\n\t"                                        \
2426ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg11 */                                              \
2427ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,44(11)\n\t"                                       \
2428ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,16(1)\n\t"                                        \
2429ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg10 */                                              \
2430ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,40(11)\n\t"                                       \
2431ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,12(1)\n\t"                                        \
2432ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* arg9 */                                               \
2433ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,36(11)\n\t"                                       \
2434ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "stw 3,8(1)\n\t"                                         \
2435ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         /* args1-8 */                                            \
2436ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2437ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 4,8(11)\n\t"                                        \
2438ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 5,12(11)\n\t"                                       \
2439ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2440ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 7,20(11)\n\t"                                       \
2441ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 8,24(11)\n\t"                                       \
2442ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 9,28(11)\n\t"                                       \
2443ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2444ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2445ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
24464118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2447ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         "mr %0,3"                                                \
2448ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*out*/   "=r" (_res)                                  \
2449ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj         : /*in*/    "r" (&_argvec[0])                            \
24504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2451ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      );                                                          \
2452ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj      lval = (__typeof__(lval)) _res;                             \
2453ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj   } while (0)
2454ead61df62ca9c9194f62d4c4a8ba288782acbb0esewardj
2455f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#endif /* PLAT_ppc32_linux */
24560ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
2457f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj/* ------------------------ ppc64-linux ------------------------ */
24580ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
2459f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#if defined(PLAT_ppc64_linux)
24609734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj
24619734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
24629734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj
24639734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj/* These regs are trashed by the hidden call. */
2464cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define __CALLER_SAVED_REGS                                       \
2465cd63639e41d591b17cf8900e49e28048d39104c2sewardj   "lr", "ctr", "xer",                                            \
2466cd63639e41d591b17cf8900e49e28048d39104c2sewardj   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
2467cd63639e41d591b17cf8900e49e28048d39104c2sewardj   "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
2468cd63639e41d591b17cf8900e49e28048d39104c2sewardj   "r11", "r12", "r13"
24699734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj
24704118e0f0df0468b3eccf2515d13c3d9c478d6f16tom/* Macros to save and align the stack before making a function
24714118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   call and restore it afterwards as gcc may not keep the stack
24724118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   pointer aligned if it doesn't realise calls are being made
24734118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   to other functions. */
24744118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
24754118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_ALIGN_STACK               \
24764118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "mr 28,1\n\t"                        \
24774118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "rldicr 1,1,0,59\n\t"
24784118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_RESTORE_STACK             \
24794118e0f0df0468b3eccf2515d13c3d9c478d6f16tom      "mr 1,28\n\t"
24804118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
24819734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
24829734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj   long) == 8. */
24839734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj
2484d68ac3e974d25f88492774f6baa491999afde9f9sewardj#define CALL_FN_W_v(lval, orig)                                   \
24859734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj   do {                                                           \
2486d68ac3e974d25f88492774f6baa491999afde9f9sewardj      volatile OrigFn        _orig = (orig);                      \
2487d68ac3e974d25f88492774f6baa491999afde9f9sewardj      volatile unsigned long _argvec[3+0];                        \
24889734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      volatile unsigned long _res;                                \
2489d68ac3e974d25f88492774f6baa491999afde9f9sewardj      /* _argvec[0] holds current r2 across the call */           \
2490d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[1] = (unsigned long)_orig.r2;                       \
2491d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[2] = (unsigned long)_orig.nraddr;                   \
24929734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      __asm__ volatile(                                           \
24934118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
24949734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         "mr 11,%1\n\t"                                           \
2495d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2496d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2497d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
24989734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
24999734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         "mr 11,%1\n\t"                                           \
25009734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         "mr %0,3\n\t"                                            \
25014118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
25024118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
25039734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         : /*out*/   "=r" (_res)                                  \
2504d68ac3e974d25f88492774f6baa491999afde9f9sewardj         : /*in*/    "r" (&_argvec[2])                            \
25054118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
25069734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      );                                                          \
25079734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      lval = (__typeof__(lval)) _res;                             \
25089734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj   } while (0)
25099734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj
2510d68ac3e974d25f88492774f6baa491999afde9f9sewardj#define CALL_FN_W_W(lval, orig, arg1)                             \
25119734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj   do {                                                           \
2512d68ac3e974d25f88492774f6baa491999afde9f9sewardj      volatile OrigFn        _orig = (orig);                      \
2513d68ac3e974d25f88492774f6baa491999afde9f9sewardj      volatile unsigned long _argvec[3+1];                        \
25149734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      volatile unsigned long _res;                                \
2515d68ac3e974d25f88492774f6baa491999afde9f9sewardj      /* _argvec[0] holds current r2 across the call */           \
2516d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2517d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2518d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
25199734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      __asm__ volatile(                                           \
25204118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
25219734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         "mr 11,%1\n\t"                                           \
2522d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2523d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2524d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2525d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
25269734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
25279734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         "mr 11,%1\n\t"                                           \
25289734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         "mr %0,3\n\t"                                            \
25294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
25304118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
25319734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         : /*out*/   "=r" (_res)                                  \
2532d68ac3e974d25f88492774f6baa491999afde9f9sewardj         : /*in*/    "r" (&_argvec[2])                            \
25334118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
25349734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      );                                                          \
25359734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      lval = (__typeof__(lval)) _res;                             \
25369734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj   } while (0)
25379734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj
2538d68ac3e974d25f88492774f6baa491999afde9f9sewardj#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
25399734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj   do {                                                           \
2540d68ac3e974d25f88492774f6baa491999afde9f9sewardj      volatile OrigFn        _orig = (orig);                      \
2541d68ac3e974d25f88492774f6baa491999afde9f9sewardj      volatile unsigned long _argvec[3+2];                        \
25429734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      volatile unsigned long _res;                                \
2543d68ac3e974d25f88492774f6baa491999afde9f9sewardj      /* _argvec[0] holds current r2 across the call */           \
2544d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2545d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2546d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2547d68ac3e974d25f88492774f6baa491999afde9f9sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
25489734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      __asm__ volatile(                                           \
25494118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
25509734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         "mr 11,%1\n\t"                                           \
2551d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2552d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2553d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2554cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2555cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2556cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2557cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2558cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
25594118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
25604118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2561cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
2562cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
25634118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2564cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2565cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2566cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2567cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2568cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
2569cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2570cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2571cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+3];                        \
2572cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2573cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2574cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2575cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2576cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2577cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2578cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2579cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
25804118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2581cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2582cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2583cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2584cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2585cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2586cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2587d68ac3e974d25f88492774f6baa491999afde9f9sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
25889734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
25899734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         "mr 11,%1\n\t"                                           \
25909734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         "mr %0,3\n\t"                                            \
25914118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
25924118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
25939734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj         : /*out*/   "=r" (_res)                                  \
2594d68ac3e974d25f88492774f6baa491999afde9f9sewardj         : /*in*/    "r" (&_argvec[2])                            \
25954118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2596cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2597cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2598cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2599cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2600cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
2601cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2602cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2603cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+4];                        \
2604cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2605cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2606cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2607cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2608cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2609cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2610cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2611cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+4] = (unsigned long)arg4;                         \
2612cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
26134118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2614cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2615cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2616cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2617cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2618cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2619cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2620cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2621cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2622cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2623cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2624cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
26254118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
26264118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2627cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
2628cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
26294118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2630cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2631cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2632cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2633cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2634cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
2635cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2636cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2637cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+5];                        \
2638cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2639cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2640cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2641cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2642cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2643cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2644cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2645cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+4] = (unsigned long)arg4;                         \
2646cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+5] = (unsigned long)arg5;                         \
2647cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
26484118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2649cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2650cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2651cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2652cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2653cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2654cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2655cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2656cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2657cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2658cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2659cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2660cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
26614118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
26624118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2663cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
2664cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
26654118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2666cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2667cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2668cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2669cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2670cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
2671cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2672cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2673cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+6];                        \
2674cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2675cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2676cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2677cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2678cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2679cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2680cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2681cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+4] = (unsigned long)arg4;                         \
2682cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+5] = (unsigned long)arg5;                         \
2683cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+6] = (unsigned long)arg6;                         \
2684cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
26854118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2686cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2687cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2688cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2689cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2690cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2691cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2692cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2693cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2694cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2695cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2696cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2697cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2698cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
26994118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
27004118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2701cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
2702cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
27034118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2704cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2705cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2706cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2707cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2708cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2709cd63639e41d591b17cf8900e49e28048d39104c2sewardj                                 arg7)                            \
2710cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2711cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2712cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+7];                        \
2713cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2714cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2715cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2716cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2717cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2718cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2719cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2720cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+4] = (unsigned long)arg4;                         \
2721cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+5] = (unsigned long)arg5;                         \
2722cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+6] = (unsigned long)arg6;                         \
2723cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+7] = (unsigned long)arg7;                         \
2724cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
27254118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2726cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2727cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2728cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2729cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2730cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2731cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2732cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2733cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2734cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2735cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2736cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2737cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2738cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2739cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
27404118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
27414118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2742cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
2743cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
27444118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2745cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2746cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2747cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2748cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2749cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2750cd63639e41d591b17cf8900e49e28048d39104c2sewardj                                 arg7,arg8)                       \
2751cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2752cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2753cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+8];                        \
2754cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2755cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2756cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2757cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2758cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2759cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2760cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2761cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+4] = (unsigned long)arg4;                         \
2762cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+5] = (unsigned long)arg5;                         \
2763cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+6] = (unsigned long)arg6;                         \
2764cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+7] = (unsigned long)arg7;                         \
2765cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+8] = (unsigned long)arg8;                         \
2766cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
27674118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2768cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2769cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2770cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2771cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2772cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2773cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2774cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2775cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2776cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2777cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2778cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2779cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2780cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2781cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2782cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
27834118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
27844118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2785cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
2786cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
27874118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2788cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2789cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2790cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2791cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2792cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2793cd63639e41d591b17cf8900e49e28048d39104c2sewardj                                 arg7,arg8,arg9)                  \
2794cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2795cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2796cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+9];                        \
2797cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2798cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2799cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2800cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2801cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2802cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2803cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2804cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+4] = (unsigned long)arg4;                         \
2805cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+5] = (unsigned long)arg5;                         \
2806cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+6] = (unsigned long)arg6;                         \
2807cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+7] = (unsigned long)arg7;                         \
2808cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+8] = (unsigned long)arg8;                         \
2809cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+9] = (unsigned long)arg9;                         \
2810cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
28114118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2812cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2813cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2814cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2815cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "addi 1,1,-128\n\t"  /* expand stack frame */            \
2816cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg9 */                                               \
2817cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,72(11)\n\t"                                       \
2818cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,112(1)\n\t"                                       \
2819cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* args1-8 */                                            \
2820cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2821cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2822cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2823cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2824cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2825cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2826cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2827cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2828cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2829cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2830cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2831cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
2832cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
28334118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2834cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
2835cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
28364118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2837cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2838cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2839cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2840cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2841cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2842cd63639e41d591b17cf8900e49e28048d39104c2sewardj                                  arg7,arg8,arg9,arg10)           \
2843cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2844cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2845cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+10];                       \
2846cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2847cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2848cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2849cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2850cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2851cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2852cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2853cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+4] = (unsigned long)arg4;                         \
2854cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+5] = (unsigned long)arg5;                         \
2855cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+6] = (unsigned long)arg6;                         \
2856cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+7] = (unsigned long)arg7;                         \
2857cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+8] = (unsigned long)arg8;                         \
2858cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+9] = (unsigned long)arg9;                         \
2859cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+10] = (unsigned long)arg10;                       \
2860cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
28614118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2862cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2863cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2864cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2865cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "addi 1,1,-128\n\t"  /* expand stack frame */            \
2866cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg10 */                                              \
2867cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,80(11)\n\t"                                       \
2868cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,120(1)\n\t"                                       \
2869cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg9 */                                               \
2870cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,72(11)\n\t"                                       \
2871cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,112(1)\n\t"                                       \
2872cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* args1-8 */                                            \
2873cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2874cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2875cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2876cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2877cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2878cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2879cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2880cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2881cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2882cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2883cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2884cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
2885cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
28864118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2887cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
2888cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
28894118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2890cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2891cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2892cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2893cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2894cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2895cd63639e41d591b17cf8900e49e28048d39104c2sewardj                                  arg7,arg8,arg9,arg10,arg11)     \
2896cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2897cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2898cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+11];                       \
2899cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2900cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2901cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2902cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2903cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2904cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2905cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2906cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+4] = (unsigned long)arg4;                         \
2907cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+5] = (unsigned long)arg5;                         \
2908cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+6] = (unsigned long)arg6;                         \
2909cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+7] = (unsigned long)arg7;                         \
2910cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+8] = (unsigned long)arg8;                         \
2911cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+9] = (unsigned long)arg9;                         \
2912cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+10] = (unsigned long)arg10;                       \
2913cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+11] = (unsigned long)arg11;                       \
2914cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
29154118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2916cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2917cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2918cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2919cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "addi 1,1,-144\n\t"  /* expand stack frame */            \
2920cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg11 */                                              \
2921cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,88(11)\n\t"                                       \
2922cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,128(1)\n\t"                                       \
2923cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg10 */                                              \
2924cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,80(11)\n\t"                                       \
2925cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,120(1)\n\t"                                       \
2926cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg9 */                                               \
2927cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,72(11)\n\t"                                       \
2928cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,112(1)\n\t"                                       \
2929cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* args1-8 */                                            \
2930cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2931cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2932cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2933cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2934cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2935cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2936cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2937cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2938cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2939cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2940cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2941cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
2942cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
29434118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
2944cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
2945cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
29464118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2947cd63639e41d591b17cf8900e49e28048d39104c2sewardj      );                                                          \
2948cd63639e41d591b17cf8900e49e28048d39104c2sewardj      lval = (__typeof__(lval)) _res;                             \
2949cd63639e41d591b17cf8900e49e28048d39104c2sewardj   } while (0)
2950cd63639e41d591b17cf8900e49e28048d39104c2sewardj
2951cd63639e41d591b17cf8900e49e28048d39104c2sewardj#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2952cd63639e41d591b17cf8900e49e28048d39104c2sewardj                                arg7,arg8,arg9,arg10,arg11,arg12) \
2953cd63639e41d591b17cf8900e49e28048d39104c2sewardj   do {                                                           \
2954cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile OrigFn        _orig = (orig);                      \
2955cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _argvec[3+12];                       \
2956cd63639e41d591b17cf8900e49e28048d39104c2sewardj      volatile unsigned long _res;                                \
2957cd63639e41d591b17cf8900e49e28048d39104c2sewardj      /* _argvec[0] holds current r2 across the call */           \
2958cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[1]   = (unsigned long)_orig.r2;                     \
2959cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2960cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+1] = (unsigned long)arg1;                         \
2961cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+2] = (unsigned long)arg2;                         \
2962cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+3] = (unsigned long)arg3;                         \
2963cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+4] = (unsigned long)arg4;                         \
2964cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+5] = (unsigned long)arg5;                         \
2965cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+6] = (unsigned long)arg6;                         \
2966cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+7] = (unsigned long)arg7;                         \
2967cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+8] = (unsigned long)arg8;                         \
2968cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+9] = (unsigned long)arg9;                         \
2969cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+10] = (unsigned long)arg10;                       \
2970cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+11] = (unsigned long)arg11;                       \
2971cd63639e41d591b17cf8900e49e28048d39104c2sewardj      _argvec[2+12] = (unsigned long)arg12;                       \
2972cd63639e41d591b17cf8900e49e28048d39104c2sewardj      __asm__ volatile(                                           \
29734118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
2974cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
2975cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 2,-16(11)\n\t"  /* save tocptr */                   \
2976cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2977cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "addi 1,1,-144\n\t"  /* expand stack frame */            \
2978cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg12 */                                              \
2979cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,96(11)\n\t"                                       \
2980cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,136(1)\n\t"                                       \
2981cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg11 */                                              \
2982cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,88(11)\n\t"                                       \
2983cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,128(1)\n\t"                                       \
2984cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg10 */                                              \
2985cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,80(11)\n\t"                                       \
2986cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,120(1)\n\t"                                       \
2987cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* arg9 */                                               \
2988cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  3,72(11)\n\t"                                       \
2989cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "std 3,112(1)\n\t"                                       \
2990cd63639e41d591b17cf8900e49e28048d39104c2sewardj         /* args1-8 */                                            \
2991cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2992cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2993cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2994cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2995cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2996cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2997cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2998cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2999cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3000cd63639e41d591b17cf8900e49e28048d39104c2sewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3001cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr 11,%1\n\t"                                           \
3002cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "mr %0,3\n\t"                                            \
3003cd63639e41d591b17cf8900e49e28048d39104c2sewardj         "ld 2,-16(11)\n\t" /* restore tocptr */                  \
30044118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
3005cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*out*/   "=r" (_res)                                  \
3006cd63639e41d591b17cf8900e49e28048d39104c2sewardj         : /*in*/    "r" (&_argvec[2])                            \
30074118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
30089734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      );                                                          \
30099734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj      lval = (__typeof__(lval)) _res;                             \
30109734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj   } while (0)
30119734b20023ddaaf95a8d1f3849224ab27fe058bfsewardj
3012f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#endif /* PLAT_ppc64_linux */
3013f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj
301459570ffbe31930ab4d678754daaeec0715117a3dsewardj/* ------------------------- arm-linux ------------------------- */
301559570ffbe31930ab4d678754daaeec0715117a3dsewardj
301659570ffbe31930ab4d678754daaeec0715117a3dsewardj#if defined(PLAT_arm_linux)
301759570ffbe31930ab4d678754daaeec0715117a3dsewardj
301859570ffbe31930ab4d678754daaeec0715117a3dsewardj/* These regs are trashed by the hidden call. */
301959570ffbe31930ab4d678754daaeec0715117a3dsewardj#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14"
302059570ffbe31930ab4d678754daaeec0715117a3dsewardj
30214118e0f0df0468b3eccf2515d13c3d9c478d6f16tom/* Macros to save and align the stack before making a function
30224118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   call and restore it afterwards as gcc may not keep the stack
30234118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   pointer aligned if it doesn't realise calls are being made
30244118e0f0df0468b3eccf2515d13c3d9c478d6f16tom   to other functions. */
30254118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
3026567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj/* This is a bit tricky.  We store the original stack pointer in r10
3027567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj   as it is callee-saves.  gcc doesn't allow the use of r11 for some
3028567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj   reason.  Also, we can't directly "bic" the stack pointer in thumb
3029567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj   mode since r13 isn't an allowed register number in that context.
3030567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj   So use r4 as a temporary, since that is about to get trashed
3031567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj   anyway, just after each use of this macro.  Side effect is we need
3032567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj   to be very careful about any future changes, since
3033567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj   VALGRIND_ALIGN_STACK simply assumes r4 is usable. */
30344118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_ALIGN_STACK               \
3035567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj      "mov r10, sp\n\t"                    \
3036567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj      "mov r4,  sp\n\t"                    \
3037567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj      "bic r4,  r4, #7\n\t"                \
3038567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj      "mov sp,  r4\n\t"
30394118e0f0df0468b3eccf2515d13c3d9c478d6f16tom#define VALGRIND_RESTORE_STACK             \
3040567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj      "mov sp,  r10\n\t"
30414118e0f0df0468b3eccf2515d13c3d9c478d6f16tom
304259570ffbe31930ab4d678754daaeec0715117a3dsewardj/* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned
304359570ffbe31930ab4d678754daaeec0715117a3dsewardj   long) == 4. */
304459570ffbe31930ab4d678754daaeec0715117a3dsewardj
304559570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_v(lval, orig)                                   \
304659570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
304759570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
304859570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[1];                          \
304959570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
305059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
305159570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
30524118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
305359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
305459570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
30554118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
305659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0\n"                                           \
305759570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
305859570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3059567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
306059570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
306159570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
306259570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
306359570ffbe31930ab4d678754daaeec0715117a3dsewardj
306459570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_W(lval, orig, arg1)                             \
306559570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
306659570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
306759570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[2];                          \
306859570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
306959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
307059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
307159570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
30724118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
307359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
307459570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
307559570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
30764118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
307759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0\n"                                           \
307859570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
307959570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3080567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
308159570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
308259570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
308359570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
308459570ffbe31930ab4d678754daaeec0715117a3dsewardj
308559570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
308659570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
308759570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
308859570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[3];                          \
308959570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
309059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
309159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
309259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
309359570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
30944118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
309559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
309659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
309759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
309859570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
30994118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
310059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0\n"                                           \
310159570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
310259570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3103567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
310459570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
310559570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
310659570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
310759570ffbe31930ab4d678754daaeec0715117a3dsewardj
310859570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
310959570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
311059570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
311159570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[4];                          \
311259570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
311359570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
311459570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
311559570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
311659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
311759570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
31184118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
311959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
312059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
312159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
312259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
312359570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
31244118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
312559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0\n"                                           \
312659570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
312759570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3128567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
312959570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
313059570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
313159570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
313259570ffbe31930ab4d678754daaeec0715117a3dsewardj
313359570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
313459570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
313559570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
313659570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[5];                          \
313759570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
313859570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
313959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
314059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
314159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
314259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[4] = (unsigned long)(arg4);                         \
314359570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
31444118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
314559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
314659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
314759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
314859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #16] \n\t"                                 \
314959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
315059570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
31514118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
315259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0"                                             \
315359570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
315459570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3155567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
315659570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
315759570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
315859570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
315959570ffbe31930ab4d678754daaeec0715117a3dsewardj
316059570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
316159570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
316259570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
316359570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[6];                          \
316459570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
316559570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
316659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
316759570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
316859570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
316959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[4] = (unsigned long)(arg4);                         \
317059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[5] = (unsigned long)(arg5);                         \
317159570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
31724118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
31734118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "sub sp, sp, #4 \n\t"                                    \
317459570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #20] \n\t"                                 \
317559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0} \n\t"                                         \
317659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
317759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
317859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
317959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #16] \n\t"                                 \
318059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
318159570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
31824118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
318359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0"                                             \
318459570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
318559570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3186567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
318759570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
318859570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
318959570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
319059570ffbe31930ab4d678754daaeec0715117a3dsewardj
319159570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
319259570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
319359570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
319459570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[7];                          \
319559570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
319659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
319759570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
319859570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
319959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
320059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[4] = (unsigned long)(arg4);                         \
320159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[5] = (unsigned long)(arg5);                         \
320259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[6] = (unsigned long)(arg6);                         \
320359570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
32044118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
320559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #20] \n\t"                                 \
320659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #24] \n\t"                                 \
320759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0, r1} \n\t"                                     \
320859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
320959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
321059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
321159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #16] \n\t"                                 \
321259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
321359570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
32144118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
321559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0"                                             \
321659570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
321759570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3218567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
321959570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
322059570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
322159570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
322259570ffbe31930ab4d678754daaeec0715117a3dsewardj
322359570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
322459570ffbe31930ab4d678754daaeec0715117a3dsewardj                                 arg7)                            \
322559570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
322659570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
322759570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[8];                          \
322859570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
322959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
323059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
323159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
323259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
323359570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[4] = (unsigned long)(arg4);                         \
323459570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[5] = (unsigned long)(arg5);                         \
323559570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[6] = (unsigned long)(arg6);                         \
323659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[7] = (unsigned long)(arg7);                         \
323759570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
32384118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
32394118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "sub sp, sp, #4 \n\t"                                    \
324059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #20] \n\t"                                 \
324159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #24] \n\t"                                 \
324259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #28] \n\t"                                 \
324359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0, r1, r2} \n\t"                                 \
324459570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
324559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
324659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
324759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #16] \n\t"                                 \
324859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
324959570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
32504118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
325159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0"                                             \
325259570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
325359570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3254567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
325559570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
325659570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
325759570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
325859570ffbe31930ab4d678754daaeec0715117a3dsewardj
325959570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
326059570ffbe31930ab4d678754daaeec0715117a3dsewardj                                 arg7,arg8)                       \
326159570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
326259570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
326359570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[9];                          \
326459570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
326559570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
326659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
326759570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
326859570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
326959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[4] = (unsigned long)(arg4);                         \
327059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[5] = (unsigned long)(arg5);                         \
327159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[6] = (unsigned long)(arg6);                         \
327259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[7] = (unsigned long)(arg7);                         \
327359570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[8] = (unsigned long)(arg8);                         \
327459570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
32754118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
327659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #20] \n\t"                                 \
327759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #24] \n\t"                                 \
327859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #28] \n\t"                                 \
327959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #32] \n\t"                                 \
328059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0, r1, r2, r3} \n\t"                             \
328159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
328259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
328359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
328459570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #16] \n\t"                                 \
328559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
328659570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
32874118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
328859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0"                                             \
328959570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
329059570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3291567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
329259570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
329359570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
329459570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
329559570ffbe31930ab4d678754daaeec0715117a3dsewardj
329659570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
329759570ffbe31930ab4d678754daaeec0715117a3dsewardj                                 arg7,arg8,arg9)                  \
329859570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
329959570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
330059570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[10];                         \
330159570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
330259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
330359570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
330459570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
330559570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
330659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[4] = (unsigned long)(arg4);                         \
330759570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[5] = (unsigned long)(arg5);                         \
330859570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[6] = (unsigned long)(arg6);                         \
330959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[7] = (unsigned long)(arg7);                         \
331059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[8] = (unsigned long)(arg8);                         \
331159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[9] = (unsigned long)(arg9);                         \
331259570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
33134118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
33144118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "sub sp, sp, #4 \n\t"                                    \
331559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #20] \n\t"                                 \
331659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #24] \n\t"                                 \
331759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #28] \n\t"                                 \
331859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #32] \n\t"                                 \
331959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1, #36] \n\t"                                 \
332059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0, r1, r2, r3, r4} \n\t"                         \
332159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
332259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
332359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
332459570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #16] \n\t"                                 \
332559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
332659570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
33274118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
332859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0"                                             \
332959570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
333059570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3331567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
333259570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
333359570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
333459570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
333559570ffbe31930ab4d678754daaeec0715117a3dsewardj
333659570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
333759570ffbe31930ab4d678754daaeec0715117a3dsewardj                                  arg7,arg8,arg9,arg10)           \
333859570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
333959570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
334059570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[11];                         \
334159570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
334259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
334359570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
334459570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
334559570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
334659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[4] = (unsigned long)(arg4);                         \
334759570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[5] = (unsigned long)(arg5);                         \
334859570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[6] = (unsigned long)(arg6);                         \
334959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[7] = (unsigned long)(arg7);                         \
335059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[8] = (unsigned long)(arg8);                         \
335159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[9] = (unsigned long)(arg9);                         \
335259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[10] = (unsigned long)(arg10);                       \
335359570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
33544118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
335559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #40] \n\t"                                 \
335659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0} \n\t"                                         \
335759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #20] \n\t"                                 \
335859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #24] \n\t"                                 \
335959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #28] \n\t"                                 \
336059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #32] \n\t"                                 \
336159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1, #36] \n\t"                                 \
336259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0, r1, r2, r3, r4} \n\t"                         \
336359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
336459570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
336559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
336659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #16] \n\t"                                 \
336759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
336859570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
33694118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
337059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0"                                             \
337159570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
337259570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3373567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
337459570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
337559570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
337659570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
337759570ffbe31930ab4d678754daaeec0715117a3dsewardj
337859570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
337959570ffbe31930ab4d678754daaeec0715117a3dsewardj                                  arg6,arg7,arg8,arg9,arg10,      \
338059570ffbe31930ab4d678754daaeec0715117a3dsewardj                                  arg11)                          \
338159570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
338259570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
338359570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[12];                         \
338459570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
338559570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
338659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
338759570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
338859570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
338959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[4] = (unsigned long)(arg4);                         \
339059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[5] = (unsigned long)(arg5);                         \
339159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[6] = (unsigned long)(arg6);                         \
339259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[7] = (unsigned long)(arg7);                         \
339359570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[8] = (unsigned long)(arg8);                         \
339459570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[9] = (unsigned long)(arg9);                         \
339559570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[10] = (unsigned long)(arg10);                       \
339659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[11] = (unsigned long)(arg11);                       \
339759570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
33984118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
33994118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         "sub sp, sp, #4 \n\t"                                    \
340059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #40] \n\t"                                 \
340159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #44] \n\t"                                 \
340259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0, r1} \n\t"                                     \
340359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #20] \n\t"                                 \
340459570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #24] \n\t"                                 \
340559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #28] \n\t"                                 \
340659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #32] \n\t"                                 \
340759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1, #36] \n\t"                                 \
340859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0, r1, r2, r3, r4} \n\t"                         \
340959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
341059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
341159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
341259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #16] \n\t"                                 \
341359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
341459570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
34154118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
341659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0"                                             \
341759570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
341859570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3419567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
342059570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
342159570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
342259570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
342359570ffbe31930ab4d678754daaeec0715117a3dsewardj
342459570ffbe31930ab4d678754daaeec0715117a3dsewardj#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
342559570ffbe31930ab4d678754daaeec0715117a3dsewardj                                  arg6,arg7,arg8,arg9,arg10,      \
342659570ffbe31930ab4d678754daaeec0715117a3dsewardj                                  arg11,arg12)                    \
342759570ffbe31930ab4d678754daaeec0715117a3dsewardj   do {                                                           \
342859570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile OrigFn        _orig = (orig);                      \
342959570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _argvec[13];                         \
343059570ffbe31930ab4d678754daaeec0715117a3dsewardj      volatile unsigned long _res;                                \
343159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
343259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[1] = (unsigned long)(arg1);                         \
343359570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[2] = (unsigned long)(arg2);                         \
343459570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[3] = (unsigned long)(arg3);                         \
343559570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[4] = (unsigned long)(arg4);                         \
343659570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[5] = (unsigned long)(arg5);                         \
343759570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[6] = (unsigned long)(arg6);                         \
343859570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[7] = (unsigned long)(arg7);                         \
343959570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[8] = (unsigned long)(arg8);                         \
344059570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[9] = (unsigned long)(arg9);                         \
344159570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[10] = (unsigned long)(arg10);                       \
344259570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[11] = (unsigned long)(arg11);                       \
344359570ffbe31930ab4d678754daaeec0715117a3dsewardj      _argvec[12] = (unsigned long)(arg12);                       \
344459570ffbe31930ab4d678754daaeec0715117a3dsewardj      __asm__ volatile(                                           \
34454118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_ALIGN_STACK                                     \
344659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #40] \n\t"                                 \
344759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #44] \n\t"                                 \
344859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #48] \n\t"                                 \
344959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0, r1, r2} \n\t"                                 \
345059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #20] \n\t"                                 \
345159570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #24] \n\t"                                 \
345259570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #28] \n\t"                                 \
345359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #32] \n\t"                                 \
345459570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1, #36] \n\t"                                 \
345559570ffbe31930ab4d678754daaeec0715117a3dsewardj         "push {r0, r1, r2, r3, r4} \n\t"                         \
345659570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r0, [%1, #4] \n\t"                                  \
345759570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r1, [%1, #8] \n\t"                                  \
345859570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r2, [%1, #12] \n\t"                                 \
345959570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r3, [%1, #16] \n\t"                                 \
346059570ffbe31930ab4d678754daaeec0715117a3dsewardj         "ldr r4, [%1] \n\t"  /* target->r4 */                    \
346159570ffbe31930ab4d678754daaeec0715117a3dsewardj         VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
34624118e0f0df0468b3eccf2515d13c3d9c478d6f16tom         VALGRIND_RESTORE_STACK                                   \
346359570ffbe31930ab4d678754daaeec0715117a3dsewardj         "mov %0, r0"                                             \
346459570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*out*/   "=r" (_res)                                  \
346559570ffbe31930ab4d678754daaeec0715117a3dsewardj         : /*in*/    "0" (&_argvec[0])                            \
3466567e5bb6edf4c1f5d8fe3e41aa0bbe63682bfeacsewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
346759570ffbe31930ab4d678754daaeec0715117a3dsewardj      );                                                          \
346859570ffbe31930ab4d678754daaeec0715117a3dsewardj      lval = (__typeof__(lval)) _res;                             \
346959570ffbe31930ab4d678754daaeec0715117a3dsewardj   } while (0)
347059570ffbe31930ab4d678754daaeec0715117a3dsewardj
347159570ffbe31930ab4d678754daaeec0715117a3dsewardj#endif /* PLAT_arm_linux */
347259570ffbe31930ab4d678754daaeec0715117a3dsewardj
3473b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* ------------------------- s390x-linux ------------------------- */
3474b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3475b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#if defined(PLAT_s390x_linux)
3476b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3477b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* Similar workaround as amd64 (see above), but we use r11 as frame
3478b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   pointer and save the old r11 in r7. r11 might be used for
3479b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   argvec, therefore we copy argvec in r1 since r1 is clobbered
3480b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   after the call anyway.  */
3481b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
3482b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#  define __FRAME_POINTER                                         \
3483b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      ,"d"(__builtin_dwarf_cfa())
3484b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#  define VALGRIND_CFI_PROLOGUE                                   \
3485b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      ".cfi_remember_state\n\t"                                   \
3486b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      "lgr 1,%1\n\t" /* copy the argvec pointer in r1 */          \
3487b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      "lgr 7,11\n\t"                                              \
3488b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      "lgr 11,%2\n\t"                                             \
3489b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      ".cfi_def_cfa r11, 0\n\t"
3490b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#  define VALGRIND_CFI_EPILOGUE                                   \
3491b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      "lgr 11, 7\n\t"                                             \
3492b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      ".cfi_restore_state\n\t"
3493b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#else
3494b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#  define __FRAME_POINTER
3495b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#  define VALGRIND_CFI_PROLOGUE                                   \
3496b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      "lgr 1,%1\n\t"
3497b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#  define VALGRIND_CFI_EPILOGUE
3498b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#endif
3499b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
35009af940f5f1832ab887b89598c7f0df519d47a092florian/* Nb: On s390 the stack pointer is properly aligned *at all times*
35019af940f5f1832ab887b89598c7f0df519d47a092florian   according to the s390 GCC maintainer. (The ABI specification is not
35029af940f5f1832ab887b89598c7f0df519d47a092florian   precise in this regard.) Therefore, VALGRIND_ALIGN_STACK and
35039af940f5f1832ab887b89598c7f0df519d47a092florian   VALGRIND_RESTORE_STACK are not defined here. */
3504b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3505b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* These regs are trashed by the hidden call. Note that we overwrite
3506b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   r14 in s390_irgen_noredir (VEX/priv/guest_s390_irgen.c) to give the
3507b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   function a proper return address. All others are ABI defined call
3508b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   clobbers. */
3509b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \
3510b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                           "f0","f1","f2","f3","f4","f5","f6","f7"
3511b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
35129af940f5f1832ab887b89598c7f0df519d47a092florian/* Nb: Although r11 is modified in the asm snippets below (inside
35139af940f5f1832ab887b89598c7f0df519d47a092florian   VALGRIND_CFI_PROLOGUE) it is not listed in the clobber section, for
35149af940f5f1832ab887b89598c7f0df519d47a092florian   two reasons:
35159af940f5f1832ab887b89598c7f0df519d47a092florian   (1) r11 is restored in VALGRIND_CFI_EPILOGUE, so effectively it is not
35169af940f5f1832ab887b89598c7f0df519d47a092florian       modified
35179af940f5f1832ab887b89598c7f0df519d47a092florian   (2) GCC will complain that r11 cannot appear inside a clobber section,
35189af940f5f1832ab887b89598c7f0df519d47a092florian       when compiled with -O -fno-omit-frame-pointer
35199af940f5f1832ab887b89598c7f0df519d47a092florian */
3520b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3521b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_v(lval, orig)                                  \
3522b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3523b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3524b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long  _argvec[1];                        \
3525b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3526b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3527b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3528b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3529b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-160\n\t"                                      \
3530b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"  /* target->r1 */                      \
3531b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3532b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3533b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,160\n\t"                                       \
3534b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3535b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3536b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "d" (&_argvec[0]) __FRAME_POINTER           \
3537b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
3538b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3539b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3540b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3541b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3542b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* The call abi has the arguments in r2-r6 and stack */
3543b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_W(lval, orig, arg1)                            \
3544b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3545b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3546b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[2];                         \
3547b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3548b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3549b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3550b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3551b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3552b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-160\n\t"                                      \
3553b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3554b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3555b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3556b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3557b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,160\n\t"                                       \
3558b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3559b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3560b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3561b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
3562b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3563b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3564b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3565b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3566b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_WW(lval, orig, arg1, arg2)                     \
3567b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3568b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3569b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[3];                         \
3570b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3571b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3572b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3573b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3574b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3575b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3576b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-160\n\t"                                      \
3577b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3578b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3579b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3580b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3581b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3582b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,160\n\t"                                       \
3583b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3584b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3585b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3586b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
3587b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3588b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3589b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3590b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3591b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3)              \
3592b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3593b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3594b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[4];                         \
3595b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3596b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3597b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3598b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3599b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3600b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3601b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3602b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-160\n\t"                                      \
3603b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3604b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3605b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3606b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3607b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3608b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3609b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,160\n\t"                                       \
3610b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3611b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3612b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3613b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
3614b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3615b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3616b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3617b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3618b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4)       \
3619b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3620b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3621b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[5];                         \
3622b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3623b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3624b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3625b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3626b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3627b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[4] = (unsigned long)arg4;                          \
3628b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3629b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3630b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-160\n\t"                                      \
3631b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3632b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3633b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3634b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 5,32(1)\n\t"                                        \
3635b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3636b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3637b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3638b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,160\n\t"                                       \
3639b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3640b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3641b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3642b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
3643b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3644b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3645b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3646b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3647b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5)   \
3648b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3649b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3650b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[6];                         \
3651b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3652b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3653b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3654b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3655b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3656b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[4] = (unsigned long)arg4;                          \
3657b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[5] = (unsigned long)arg5;                          \
3658b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3659b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3660b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-160\n\t"                                      \
3661b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3662b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3663b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3664b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 5,32(1)\n\t"                                        \
3665b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 6,40(1)\n\t"                                        \
3666b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3667b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3668b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3669b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,160\n\t"                                       \
3670b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3671b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3672b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3673b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3674b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3675b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3676b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3677b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3678b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
3679b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     arg6)                                       \
3680b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3681b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3682b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[7];                         \
3683b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3684b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3685b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3686b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3687b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3688b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[4] = (unsigned long)arg4;                          \
3689b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[5] = (unsigned long)arg5;                          \
3690b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[6] = (unsigned long)arg6;                          \
3691b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3692b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3693b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-168\n\t"                                      \
3694b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3695b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3696b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3697b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 5,32(1)\n\t"                                        \
3698b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 6,40(1)\n\t"                                        \
3699b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 160(8,15), 48(1)\n\t"                              \
3700b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3701b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3702b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3703b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,168\n\t"                                       \
3704b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3705b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3706b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3707b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3708b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3709b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3710b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3711b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3712b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
3713b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     arg6, arg7)                                 \
3714b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3715b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3716b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[8];                         \
3717b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3718b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3719b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3720b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3721b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3722b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[4] = (unsigned long)arg4;                          \
3723b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[5] = (unsigned long)arg5;                          \
3724b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[6] = (unsigned long)arg6;                          \
3725b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[7] = (unsigned long)arg7;                          \
3726b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3727b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3728b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-176\n\t"                                      \
3729b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3730b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3731b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3732b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 5,32(1)\n\t"                                        \
3733b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 6,40(1)\n\t"                                        \
3734b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 160(8,15), 48(1)\n\t"                              \
3735b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 168(8,15), 56(1)\n\t"                              \
3736b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3737b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3738b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3739b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,176\n\t"                                       \
3740b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3741b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3742b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3743b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3744b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3745b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3746b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3747b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3748b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
3749b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     arg6, arg7 ,arg8)                           \
3750b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3751b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3752b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[9];                         \
3753b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3754b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3755b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3756b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3757b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3758b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[4] = (unsigned long)arg4;                          \
3759b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[5] = (unsigned long)arg5;                          \
3760b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[6] = (unsigned long)arg6;                          \
3761b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[7] = (unsigned long)arg7;                          \
3762b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[8] = (unsigned long)arg8;                          \
3763b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3764b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3765b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-184\n\t"                                      \
3766b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3767b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3768b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3769b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 5,32(1)\n\t"                                        \
3770b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 6,40(1)\n\t"                                        \
3771b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 160(8,15), 48(1)\n\t"                              \
3772b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 168(8,15), 56(1)\n\t"                              \
3773b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 176(8,15), 64(1)\n\t"                              \
3774b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3775b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3776b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3777b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,184\n\t"                                       \
3778b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3779b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3780b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3781b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3782b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3783b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3784b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3785b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3786b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
3787b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     arg6, arg7 ,arg8, arg9)                     \
3788b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3789b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3790b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[10];                        \
3791b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3792b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3793b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3794b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3795b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3796b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[4] = (unsigned long)arg4;                          \
3797b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[5] = (unsigned long)arg5;                          \
3798b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[6] = (unsigned long)arg6;                          \
3799b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[7] = (unsigned long)arg7;                          \
3800b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[8] = (unsigned long)arg8;                          \
3801b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[9] = (unsigned long)arg9;                          \
3802b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3803b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3804b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-192\n\t"                                      \
3805b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3806b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3807b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3808b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 5,32(1)\n\t"                                        \
3809b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 6,40(1)\n\t"                                        \
3810b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 160(8,15), 48(1)\n\t"                              \
3811b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 168(8,15), 56(1)\n\t"                              \
3812b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 176(8,15), 64(1)\n\t"                              \
3813b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 184(8,15), 72(1)\n\t"                              \
3814b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3815b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3816b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3817b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,192\n\t"                                       \
3818b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3819b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3820b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3821b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3822b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3823b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3824b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3825b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3826b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5,  \
3827b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     arg6, arg7 ,arg8, arg9, arg10)              \
3828b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3829b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3830b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[11];                        \
3831b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3832b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3833b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3834b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3835b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3836b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[4] = (unsigned long)arg4;                          \
3837b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[5] = (unsigned long)arg5;                          \
3838b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[6] = (unsigned long)arg6;                          \
3839b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[7] = (unsigned long)arg7;                          \
3840b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[8] = (unsigned long)arg8;                          \
3841b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[9] = (unsigned long)arg9;                          \
3842b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[10] = (unsigned long)arg10;                        \
3843b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3844b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3845b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-200\n\t"                                      \
3846b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3847b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3848b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3849b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 5,32(1)\n\t"                                        \
3850b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 6,40(1)\n\t"                                        \
3851b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 160(8,15), 48(1)\n\t"                              \
3852b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 168(8,15), 56(1)\n\t"                              \
3853b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 176(8,15), 64(1)\n\t"                              \
3854b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 184(8,15), 72(1)\n\t"                              \
3855b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 192(8,15), 80(1)\n\t"                              \
3856b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3857b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3858b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3859b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,200\n\t"                                       \
3860b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3861b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3862b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3863b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3864b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3865b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3866b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3867b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3868b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5,  \
3869b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     arg6, arg7 ,arg8, arg9, arg10, arg11)       \
3870b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3871b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3872b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[12];                        \
3873b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3874b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3875b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3876b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3877b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3878b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[4] = (unsigned long)arg4;                          \
3879b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[5] = (unsigned long)arg5;                          \
3880b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[6] = (unsigned long)arg6;                          \
3881b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[7] = (unsigned long)arg7;                          \
3882b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[8] = (unsigned long)arg8;                          \
3883b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[9] = (unsigned long)arg9;                          \
3884b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[10] = (unsigned long)arg10;                        \
3885b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[11] = (unsigned long)arg11;                        \
3886b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3887b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3888b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-208\n\t"                                      \
3889b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3890b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3891b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3892b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 5,32(1)\n\t"                                        \
3893b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 6,40(1)\n\t"                                        \
3894b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 160(8,15), 48(1)\n\t"                              \
3895b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 168(8,15), 56(1)\n\t"                              \
3896b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 176(8,15), 64(1)\n\t"                              \
3897b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 184(8,15), 72(1)\n\t"                              \
3898b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 192(8,15), 80(1)\n\t"                              \
3899b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 200(8,15), 88(1)\n\t"                              \
3900b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3901b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3902b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3903b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,208\n\t"                                       \
3904b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3905b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3906b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3907b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3908b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3909b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3910b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3911b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3912b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5,  \
3913b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                     arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\
3914b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   do {                                                          \
3915b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile OrigFn        _orig = (orig);                     \
3916b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _argvec[13];                        \
3917b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      volatile unsigned long _res;                               \
3918b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                  \
3919b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[1] = (unsigned long)arg1;                          \
3920b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[2] = (unsigned long)arg2;                          \
3921b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[3] = (unsigned long)arg3;                          \
3922b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[4] = (unsigned long)arg4;                          \
3923b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[5] = (unsigned long)arg5;                          \
3924b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[6] = (unsigned long)arg6;                          \
3925b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[7] = (unsigned long)arg7;                          \
3926b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[8] = (unsigned long)arg8;                          \
3927b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[9] = (unsigned long)arg9;                          \
3928b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[10] = (unsigned long)arg10;                        \
3929b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[11] = (unsigned long)arg11;                        \
3930b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      _argvec[12] = (unsigned long)arg12;                        \
3931b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      __asm__ volatile(                                          \
3932b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_PROLOGUE                                   \
3933b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,-216\n\t"                                      \
3934b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 2, 8(1)\n\t"                                        \
3935b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 3,16(1)\n\t"                                        \
3936b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 4,24(1)\n\t"                                        \
3937b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 5,32(1)\n\t"                                        \
3938b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 6,40(1)\n\t"                                        \
3939b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 160(8,15), 48(1)\n\t"                              \
3940b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 168(8,15), 56(1)\n\t"                              \
3941b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 176(8,15), 64(1)\n\t"                              \
3942b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 184(8,15), 72(1)\n\t"                              \
3943b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 192(8,15), 80(1)\n\t"                              \
3944b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 200(8,15), 88(1)\n\t"                              \
3945b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "mvc 208(8,15), 96(1)\n\t"                              \
3946b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lg 1, 0(1)\n\t"                                        \
3947b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CALL_NOREDIR_R1                                \
3948b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "lgr %0, 2\n\t"                                         \
3949b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         "aghi 15,216\n\t"                                       \
3950b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         VALGRIND_CFI_EPILOGUE                                   \
3951b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*out*/   "=d" (_res)                                 \
3952b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
3953b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj         : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3954b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      );                                                         \
3955b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      lval = (__typeof__(lval)) _res;                            \
3956b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } while (0)
3957b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3958b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
3959b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#endif /* PLAT_s390x_linux */
3960b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
39614df0bfc0614379192c780c944415dc420d9cfe8epetarj/* ------------------------- mips32-linux ----------------------- */
39625db15403e889d4db339b342bc2a824ef0bfaa654sewardj
39635db15403e889d4db339b342bc2a824ef0bfaa654sewardj#if defined(PLAT_mips32_linux)
39645db15403e889d4db339b342bc2a824ef0bfaa654sewardj
39655db15403e889d4db339b342bc2a824ef0bfaa654sewardj/* These regs are trashed by the hidden call. */
39665db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6",       \
39675db15403e889d4db339b342bc2a824ef0bfaa654sewardj"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
39685db15403e889d4db339b342bc2a824ef0bfaa654sewardj"$25", "$31"
39695db15403e889d4db339b342bc2a824ef0bfaa654sewardj
39705db15403e889d4db339b342bc2a824ef0bfaa654sewardj/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned
39715db15403e889d4db339b342bc2a824ef0bfaa654sewardj   long) == 4. */
39725db15403e889d4db339b342bc2a824ef0bfaa654sewardj
39735db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_v(lval, orig)                                   \
39745db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
39755db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
39765db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[1];                          \
39775db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
39785db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
39795db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
39805db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
39814df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
39824df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
39834df0bfc0614379192c780c944415dc420d9cfe8epetarj         "subu $29, $29, 16 \n\t"                                 \
39844df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
39855db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
39865db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 16\n\t"                                  \
39874df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
39884df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
39895db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 8 \n\t"                                  \
39904df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
39915db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
39925db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
39934df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
39945db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
39955db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
39965db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
39975db15403e889d4db339b342bc2a824ef0bfaa654sewardj
39985db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_W(lval, orig, arg1)                             \
39995db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
40005db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
40015db15403e889d4db339b342bc2a824ef0bfaa654sewardj     volatile unsigned long _argvec[2];                           \
40025db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
40035db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
40045db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
40055db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
40065db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
40074df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
40084df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
40095db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 16 \n\t"                                 \
40104df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"   /* arg1*/                          \
40114df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
40125db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
40135db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 16 \n\t"                                 \
40144df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
40154df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
40165db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 8 \n\t"                                  \
40174df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
40185db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
40194df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "0" (&_argvec[0])                            \
40204df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory",  __CALLER_SAVED_REGS               \
40215db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
40225db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
40235db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
40245db15403e889d4db339b342bc2a824ef0bfaa654sewardj
40255db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
40265db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
40275db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
40285db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[3];                          \
40295db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
40305db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
40315db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
40325db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
40335db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
40345db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
40354df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
40364df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
40375db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 16 \n\t"                                 \
40384df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
40394df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
40404df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
40415db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
40425db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 16 \n\t"                                 \
40434df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
40444df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
40455db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 8 \n\t"                                  \
40464df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
40475db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
40485db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
40494df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
40505db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
40515db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
40525db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
40535db15403e889d4db339b342bc2a824ef0bfaa654sewardj
40545db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
40555db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
40565db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
40575db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[4];                          \
40585db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
40595db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
40605db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
40615db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
40625db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
40635db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
40645db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
40654df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
40664df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
40675db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 16 \n\t"                                 \
40684df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
40694df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
40704df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
40714df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
40725db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
40735db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 16 \n\t"                                 \
40744df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
40754df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
40765db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 8 \n\t"                                  \
40774df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
40785db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
40795db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
40804df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
40815db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
40825db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
40835db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
40845db15403e889d4db339b342bc2a824ef0bfaa654sewardj
40855db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
40865db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
40875db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
40885db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[5];                          \
40895db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
40905db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
40915db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
40925db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
40935db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
40945db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[4] = (unsigned long)(arg4);                         \
40955db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
40965db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
40974df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
40984df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
40995db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 16 \n\t"                                 \
41004df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
41014df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
41024df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
41034df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $7, 16(%1) \n\t"                                     \
41044df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
41055db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
41065db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 16 \n\t"                                 \
41074df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
41084df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
41095db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 8 \n\t"                                  \
41104df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
41115db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
41125db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
41134df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
41145db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
41155db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
41165db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
41175db15403e889d4db339b342bc2a824ef0bfaa654sewardj
41185db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
41195db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
41205db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
41215db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[6];                          \
41225db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
41235db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
41245db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
41255db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
41265db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
41275db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[4] = (unsigned long)(arg4);                         \
41285db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[5] = (unsigned long)(arg5);                         \
41295db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
41305db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
41314df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
41324df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
41334df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 20(%1) \n\t"                                     \
41344df0bfc0614379192c780c944415dc420d9cfe8epetarj         "subu $29, $29, 24\n\t"                                  \
41354df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 16($29) \n\t"                                    \
41364df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
41374df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
41384df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
41394df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $7, 16(%1) \n\t"                                     \
41404df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
41415db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
41425db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "addu $29, $29, 24 \n\t"                                 \
41434df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
41444df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
41454df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 8 \n\t"                                  \
41464df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
41475db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
41485db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
41494df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
41505db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
41515db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
41525db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
41535db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
41545db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
41555db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
41565db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[7];                          \
41575db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
41585db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
41595db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
41605db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
41615db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
41625db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[4] = (unsigned long)(arg4);                         \
41635db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[5] = (unsigned long)(arg5);                         \
41645db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[6] = (unsigned long)(arg6);                         \
41655db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
41665db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
41674df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
41684df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
41694df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 20(%1) \n\t"                                     \
41704df0bfc0614379192c780c944415dc420d9cfe8epetarj         "subu $29, $29, 32\n\t"                                  \
41714df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 16($29) \n\t"                                    \
41724df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 24(%1) \n\t"                                     \
41735db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "nop\n\t"                                                \
41744df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 20($29) \n\t"                                    \
41754df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
41764df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
41774df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
41784df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $7, 16(%1) \n\t"                                     \
41794df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
41805db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
41814df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 32 \n\t"                                 \
41824df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
41834df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
41844df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 8 \n\t"                                  \
41854df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
41865db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
41875db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
41884df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
41895db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
41905db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
41915db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
41925db15403e889d4db339b342bc2a824ef0bfaa654sewardj
41935db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
41945db15403e889d4db339b342bc2a824ef0bfaa654sewardj                                 arg7)                            \
41955db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
41965db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
41975db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[8];                          \
41985db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
41995db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
42005db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
42015db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
42025db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
42035db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[4] = (unsigned long)(arg4);                         \
42045db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[5] = (unsigned long)(arg5);                         \
42055db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[6] = (unsigned long)(arg6);                         \
42065db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[7] = (unsigned long)(arg7);                         \
42075db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
42085db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
42094df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
42104df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
42114df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 20(%1) \n\t"                                     \
42124df0bfc0614379192c780c944415dc420d9cfe8epetarj         "subu $29, $29, 32\n\t"                                  \
42134df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 16($29) \n\t"                                    \
42144df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 24(%1) \n\t"                                     \
42154df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 20($29) \n\t"                                    \
42164df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 28(%1) \n\t"                                     \
42174df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 24($29) \n\t"                                    \
42184df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
42194df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
42204df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
42214df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $7, 16(%1) \n\t"                                     \
42224df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
42235db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
42244df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 32 \n\t"                                 \
42254df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
42264df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
42274df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 8 \n\t"                                  \
42284df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
42295db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
42305db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
42314df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
42325db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
42335db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
42345db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
42355db15403e889d4db339b342bc2a824ef0bfaa654sewardj
42365db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
42375db15403e889d4db339b342bc2a824ef0bfaa654sewardj                                 arg7,arg8)                       \
42385db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
42395db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
42405db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[9];                          \
42415db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
42425db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
42435db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
42445db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
42455db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
42465db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[4] = (unsigned long)(arg4);                         \
42475db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[5] = (unsigned long)(arg5);                         \
42485db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[6] = (unsigned long)(arg6);                         \
42495db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[7] = (unsigned long)(arg7);                         \
42505db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[8] = (unsigned long)(arg8);                         \
42515db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
42525db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
42534df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
42544df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
42554df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 20(%1) \n\t"                                     \
42564df0bfc0614379192c780c944415dc420d9cfe8epetarj         "subu $29, $29, 40\n\t"                                  \
42574df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 16($29) \n\t"                                    \
42584df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 24(%1) \n\t"                                     \
42594df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 20($29) \n\t"                                    \
42604df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 28(%1) \n\t"                                     \
42614df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 24($29) \n\t"                                    \
42624df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 32(%1) \n\t"                                     \
42634df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 28($29) \n\t"                                    \
42644df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
42654df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
42664df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
42674df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $7, 16(%1) \n\t"                                     \
42684df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
42695db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
42704df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 40 \n\t"                                 \
42714df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
42724df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
42734df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 8 \n\t"                                  \
42744df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
42755db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
42765db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
42774df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
42785db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
42795db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
42805db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
42815db15403e889d4db339b342bc2a824ef0bfaa654sewardj
42825db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
42835db15403e889d4db339b342bc2a824ef0bfaa654sewardj                                 arg7,arg8,arg9)                  \
42845db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
42855db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
42865db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[10];                         \
42875db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
42885db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
42895db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
42905db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
42915db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
42925db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[4] = (unsigned long)(arg4);                         \
42935db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[5] = (unsigned long)(arg5);                         \
42945db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[6] = (unsigned long)(arg6);                         \
42955db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[7] = (unsigned long)(arg7);                         \
42965db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[8] = (unsigned long)(arg8);                         \
42975db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[9] = (unsigned long)(arg9);                         \
42985db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
42995db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
43004df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
43014df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
43024df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 20(%1) \n\t"                                     \
43034df0bfc0614379192c780c944415dc420d9cfe8epetarj         "subu $29, $29, 40\n\t"                                  \
43044df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 16($29) \n\t"                                    \
43054df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 24(%1) \n\t"                                     \
43064df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 20($29) \n\t"                                    \
43074df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 28(%1) \n\t"                                     \
43084df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 24($29) \n\t"                                    \
43094df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 32(%1) \n\t"                                     \
43104df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 28($29) \n\t"                                    \
43114df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 36(%1) \n\t"                                     \
43124df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 32($29) \n\t"                                    \
43134df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
43144df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
43154df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
43164df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $7, 16(%1) \n\t"                                     \
43174df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
43185db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
43194df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 40 \n\t"                                 \
43204df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
43214df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
43224df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 8 \n\t"                                  \
43234df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
43245db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
43255db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
43264df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
43275db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
43285db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
43295db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
43305db15403e889d4db339b342bc2a824ef0bfaa654sewardj
43315db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
43325db15403e889d4db339b342bc2a824ef0bfaa654sewardj                                  arg7,arg8,arg9,arg10)           \
43335db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
43345db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
43355db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[11];                         \
43365db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
43375db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
43385db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
43395db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
43405db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
43415db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[4] = (unsigned long)(arg4);                         \
43425db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[5] = (unsigned long)(arg5);                         \
43435db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[6] = (unsigned long)(arg6);                         \
43445db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[7] = (unsigned long)(arg7);                         \
43455db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[8] = (unsigned long)(arg8);                         \
43465db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[9] = (unsigned long)(arg9);                         \
43475db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[10] = (unsigned long)(arg10);                       \
43485db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
43495db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
43504df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
43514df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
43524df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 20(%1) \n\t"                                     \
43534df0bfc0614379192c780c944415dc420d9cfe8epetarj         "subu $29, $29, 48\n\t"                                  \
43544df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 16($29) \n\t"                                    \
43554df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 24(%1) \n\t"                                     \
43564df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 20($29) \n\t"                                    \
43574df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 28(%1) \n\t"                                     \
43584df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 24($29) \n\t"                                    \
43594df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 32(%1) \n\t"                                     \
43604df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 28($29) \n\t"                                    \
43614df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 36(%1) \n\t"                                     \
43624df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 32($29) \n\t"                                    \
43634df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 40(%1) \n\t"                                     \
43644df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 36($29) \n\t"                                    \
43654df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
43664df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
43674df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
43684df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $7, 16(%1) \n\t"                                     \
43694df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
43705db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
43714df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 48 \n\t"                                 \
43724df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
43734df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
43744df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 8 \n\t"                                  \
43754df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
43765db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
43775db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
43784df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
43795db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
43805db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
43815db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
43825db15403e889d4db339b342bc2a824ef0bfaa654sewardj
43835db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
43845db15403e889d4db339b342bc2a824ef0bfaa654sewardj                                  arg6,arg7,arg8,arg9,arg10,      \
43855db15403e889d4db339b342bc2a824ef0bfaa654sewardj                                  arg11)                          \
43865db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
43875db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
43885db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[12];                         \
43895db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
43905db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
43915db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
43925db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
43935db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
43945db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[4] = (unsigned long)(arg4);                         \
43955db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[5] = (unsigned long)(arg5);                         \
43965db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[6] = (unsigned long)(arg6);                         \
43975db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[7] = (unsigned long)(arg7);                         \
43985db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[8] = (unsigned long)(arg8);                         \
43995db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[9] = (unsigned long)(arg9);                         \
44005db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[10] = (unsigned long)(arg10);                       \
44015db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[11] = (unsigned long)(arg11);                       \
44025db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
44035db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
44044df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
44054df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
44064df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 20(%1) \n\t"                                     \
44074df0bfc0614379192c780c944415dc420d9cfe8epetarj         "subu $29, $29, 48\n\t"                                  \
44084df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 16($29) \n\t"                                    \
44094df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 24(%1) \n\t"                                     \
44104df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 20($29) \n\t"                                    \
44114df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 28(%1) \n\t"                                     \
44124df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 24($29) \n\t"                                    \
44134df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 32(%1) \n\t"                                     \
44144df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 28($29) \n\t"                                    \
44154df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 36(%1) \n\t"                                     \
44164df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 32($29) \n\t"                                    \
44174df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 40(%1) \n\t"                                     \
44184df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 36($29) \n\t"                                    \
44194df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 44(%1) \n\t"                                     \
44204df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 40($29) \n\t"                                    \
44214df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
44224df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
44234df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
44244df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $7, 16(%1) \n\t"                                     \
44254df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
44265db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
44274df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 48 \n\t"                                 \
44284df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
44294df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
44304df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 8 \n\t"                                  \
44314df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
44325db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
44335db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*in*/    "0" (&_argvec[0])                            \
44344df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
44355db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
44365db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
44375db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
44385db15403e889d4db339b342bc2a824ef0bfaa654sewardj
44395db15403e889d4db339b342bc2a824ef0bfaa654sewardj#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
44405db15403e889d4db339b342bc2a824ef0bfaa654sewardj                                  arg6,arg7,arg8,arg9,arg10,      \
44415db15403e889d4db339b342bc2a824ef0bfaa654sewardj                                  arg11,arg12)                    \
44425db15403e889d4db339b342bc2a824ef0bfaa654sewardj   do {                                                           \
44435db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile OrigFn        _orig = (orig);                      \
44445db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _argvec[13];                         \
44455db15403e889d4db339b342bc2a824ef0bfaa654sewardj      volatile unsigned long _res;                                \
44465db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
44475db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[1] = (unsigned long)(arg1);                         \
44485db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[2] = (unsigned long)(arg2);                         \
44495db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[3] = (unsigned long)(arg3);                         \
44505db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[4] = (unsigned long)(arg4);                         \
44515db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[5] = (unsigned long)(arg5);                         \
44525db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[6] = (unsigned long)(arg6);                         \
44535db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[7] = (unsigned long)(arg7);                         \
44545db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[8] = (unsigned long)(arg8);                         \
44555db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[9] = (unsigned long)(arg9);                         \
44565db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[10] = (unsigned long)(arg10);                       \
44575db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[11] = (unsigned long)(arg11);                       \
44585db15403e889d4db339b342bc2a824ef0bfaa654sewardj      _argvec[12] = (unsigned long)(arg12);                       \
44595db15403e889d4db339b342bc2a824ef0bfaa654sewardj      __asm__ volatile(                                           \
44605db15403e889d4db339b342bc2a824ef0bfaa654sewardj         "subu $29, $29, 8 \n\t"                                  \
44614df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $28, 0($29) \n\t"                                    \
44624df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $31, 4($29) \n\t"                                    \
44634df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 20(%1) \n\t"                                     \
44644df0bfc0614379192c780c944415dc420d9cfe8epetarj         "subu $29, $29, 56\n\t"                                  \
44654df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 16($29) \n\t"                                    \
44664df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 24(%1) \n\t"                                     \
44674df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 20($29) \n\t"                                    \
44684df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 28(%1) \n\t"                                     \
44694df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 24($29) \n\t"                                    \
44704df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 32(%1) \n\t"                                     \
44714df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 28($29) \n\t"                                    \
44724df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 36(%1) \n\t"                                     \
44734df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 32($29) \n\t"                                    \
44744df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 40(%1) \n\t"                                     \
44754df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 36($29) \n\t"                                    \
44764df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 44(%1) \n\t"                                     \
44774df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 40($29) \n\t"                                    \
44784df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 48(%1) \n\t"                                     \
44794df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sw $4, 44($29) \n\t"                                    \
44804df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $4, 4(%1) \n\t"                                      \
44814df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $5, 8(%1) \n\t"                                      \
44824df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $6, 12(%1) \n\t"                                     \
44834df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $7, 16(%1) \n\t"                                     \
44844df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
44855db15403e889d4db339b342bc2a824ef0bfaa654sewardj         VALGRIND_CALL_NOREDIR_T9                                 \
44864df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 56 \n\t"                                 \
44874df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $28, 0($29) \n\t"                                    \
44884df0bfc0614379192c780c944415dc420d9cfe8epetarj         "lw $31, 4($29) \n\t"                                    \
44894df0bfc0614379192c780c944415dc420d9cfe8epetarj         "addu $29, $29, 8 \n\t"                                  \
44904df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
44915db15403e889d4db339b342bc2a824ef0bfaa654sewardj         : /*out*/   "=r" (_res)                                  \
44924df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
44934df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
44945db15403e889d4db339b342bc2a824ef0bfaa654sewardj      );                                                          \
44955db15403e889d4db339b342bc2a824ef0bfaa654sewardj      lval = (__typeof__(lval)) _res;                             \
44965db15403e889d4db339b342bc2a824ef0bfaa654sewardj   } while (0)
44975db15403e889d4db339b342bc2a824ef0bfaa654sewardj
44985db15403e889d4db339b342bc2a824ef0bfaa654sewardj#endif /* PLAT_mips32_linux */
44995db15403e889d4db339b342bc2a824ef0bfaa654sewardj
45004df0bfc0614379192c780c944415dc420d9cfe8epetarj/* ------------------------- mips64-linux ------------------------- */
45014df0bfc0614379192c780c944415dc420d9cfe8epetarj
45024df0bfc0614379192c780c944415dc420d9cfe8epetarj#if defined(PLAT_mips64_linux)
45034df0bfc0614379192c780c944415dc420d9cfe8epetarj
45044df0bfc0614379192c780c944415dc420d9cfe8epetarj/* These regs are trashed by the hidden call. */
45054df0bfc0614379192c780c944415dc420d9cfe8epetarj#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6",       \
45064df0bfc0614379192c780c944415dc420d9cfe8epetarj"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
45074df0bfc0614379192c780c944415dc420d9cfe8epetarj"$25", "$31"
45084df0bfc0614379192c780c944415dc420d9cfe8epetarj
45094df0bfc0614379192c780c944415dc420d9cfe8epetarj/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned
45104df0bfc0614379192c780c944415dc420d9cfe8epetarj   long) == 4. */
45114df0bfc0614379192c780c944415dc420d9cfe8epetarj
45124df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_v(lval, orig)                                   \
45134df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
45144df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
45154df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[1];                          \
45164df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
45174df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
45184df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
45194df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
45204df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
45214df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
45224df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
45234df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "0" (&_argvec[0])                            \
45244df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
45254df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
45264df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
45274df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
45284df0bfc0614379192c780c944415dc420d9cfe8epetarj
45294df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_W(lval, orig, arg1)                             \
45304df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
45314df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
45324df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[2];                          \
45334df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
45344df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
45354df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
45364df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
45374df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"   /* arg1*/                           \
45384df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
45394df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
45404df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
45414df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
45424df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
45434df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
45444df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
45454df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
45464df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
45474df0bfc0614379192c780c944415dc420d9cfe8epetarj
45484df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
45494df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
45504df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
45514df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[3];                          \
45524df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
45534df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
45544df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
45554df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
45564df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
45574df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
45584df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
45594df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
45604df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
45614df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
45624df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
45634df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
45644df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
45654df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
45664df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
45674df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
45684df0bfc0614379192c780c944415dc420d9cfe8epetarj
45694df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
45704df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
45714df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
45724df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[4];                          \
45734df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
45744df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
45754df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
45764df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
45774df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
45784df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
45794df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
45804df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
45814df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
45824df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
45834df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
45844df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
45854df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
45864df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
45874df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
45884df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
45894df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
45904df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
45914df0bfc0614379192c780c944415dc420d9cfe8epetarj
45924df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
45934df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
45944df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
45954df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[5];                          \
45964df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
45974df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
45984df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
45994df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
46004df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
46014df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[4] = (unsigned long)(arg4);                         \
46024df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
46034df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
46044df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
46054df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
46064df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $7, 32(%1)\n\t"                                      \
46074df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
46084df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
46094df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
46104df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
46114df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
46124df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
46134df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
46144df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
46154df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
46164df0bfc0614379192c780c944415dc420d9cfe8epetarj
46174df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
46184df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
46194df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
46204df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[6];                          \
46214df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
46224df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
46234df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
46244df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
46254df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
46264df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[4] = (unsigned long)(arg4);                         \
46274df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[5] = (unsigned long)(arg5);                         \
46284df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
46294df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
46304df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
46314df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
46324df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $7, 32(%1)\n\t"                                      \
46334df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $8, 40(%1)\n\t"                                      \
46344df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
46354df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
46364df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
46374df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
46384df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
46394df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
46404df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
46414df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
46424df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
46434df0bfc0614379192c780c944415dc420d9cfe8epetarj
46444df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
46454df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
46464df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
46474df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[7];                          \
46484df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
46494df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
46504df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
46514df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
46524df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
46534df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[4] = (unsigned long)(arg4);                         \
46544df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[5] = (unsigned long)(arg5);                         \
46554df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[6] = (unsigned long)(arg6);                         \
46564df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
46574df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
46584df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
46594df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
46604df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $7, 32(%1)\n\t"                                      \
46614df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $8, 40(%1)\n\t"                                      \
46624df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $9, 48(%1)\n\t"                                      \
46634df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
46644df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
46654df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
46664df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
46674df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
46684df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
46694df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
46704df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
46714df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
46724df0bfc0614379192c780c944415dc420d9cfe8epetarj
46734df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
46744df0bfc0614379192c780c944415dc420d9cfe8epetarj                                 arg7)                            \
46754df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
46764df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
46774df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[8];                          \
46784df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
46794df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
46804df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
46814df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
46824df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
46834df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[4] = (unsigned long)(arg4);                         \
46844df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[5] = (unsigned long)(arg5);                         \
46854df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[6] = (unsigned long)(arg6);                         \
46864df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[7] = (unsigned long)(arg7);                         \
46874df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
46884df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
46894df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
46904df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
46914df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $7, 32(%1)\n\t"                                      \
46924df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $8, 40(%1)\n\t"                                      \
46934df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $9, 48(%1)\n\t"                                      \
46944df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $10, 56(%1)\n\t"                                     \
46954df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1) \n\t"  /* target->t9 */                   \
46964df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
46974df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
46984df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
46994df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
47004df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
47014df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
47024df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
47034df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
47044df0bfc0614379192c780c944415dc420d9cfe8epetarj
47054df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
47064df0bfc0614379192c780c944415dc420d9cfe8epetarj                                 arg7,arg8)                       \
47074df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
47084df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
47094df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[9];                          \
47104df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
47114df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
47124df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
47134df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
47144df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
47154df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[4] = (unsigned long)(arg4);                         \
47164df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[5] = (unsigned long)(arg5);                         \
47174df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[6] = (unsigned long)(arg6);                         \
47184df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[7] = (unsigned long)(arg7);                         \
47194df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[8] = (unsigned long)(arg8);                         \
47204df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
47214df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
47224df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
47234df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
47244df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $7, 32(%1)\n\t"                                      \
47254df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $8, 40(%1)\n\t"                                      \
47264df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $9, 48(%1)\n\t"                                      \
47274df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $10, 56(%1)\n\t"                                     \
47284df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $11, 64(%1)\n\t"                                     \
47294df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1) \n\t"  /* target->t9 */                   \
47304df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
47314df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
47324df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
47334df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
47344df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
47354df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
47364df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
47374df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
47384df0bfc0614379192c780c944415dc420d9cfe8epetarj
47394df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
47404df0bfc0614379192c780c944415dc420d9cfe8epetarj                                 arg7,arg8,arg9)                  \
47414df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
47424df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
47434df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[10];                         \
47444df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
47454df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
47464df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
47474df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
47484df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
47494df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[4] = (unsigned long)(arg4);                         \
47504df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[5] = (unsigned long)(arg5);                         \
47514df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[6] = (unsigned long)(arg6);                         \
47524df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[7] = (unsigned long)(arg7);                         \
47534df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[8] = (unsigned long)(arg8);                         \
47544df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[9] = (unsigned long)(arg9);                         \
47554df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
47564df0bfc0614379192c780c944415dc420d9cfe8epetarj         "dsubu $29, $29, 8\n\t"                                  \
47574df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 72(%1)\n\t"                                      \
47584df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 0($29)\n\t"                                      \
47594df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
47604df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
47614df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
47624df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $7, 32(%1)\n\t"                                      \
47634df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $8, 40(%1)\n\t"                                      \
47644df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $9, 48(%1)\n\t"                                      \
47654df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $10, 56(%1)\n\t"                                     \
47664df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $11, 64(%1)\n\t"                                     \
47674df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
47684df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
47694df0bfc0614379192c780c944415dc420d9cfe8epetarj         "daddu $29, $29, 8\n\t"                                  \
47704df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
47714df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
47724df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
47734df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
47744df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
47754df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
47764df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
47774df0bfc0614379192c780c944415dc420d9cfe8epetarj
47784df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
47794df0bfc0614379192c780c944415dc420d9cfe8epetarj                                  arg7,arg8,arg9,arg10)           \
47804df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
47814df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
47824df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[11];                         \
47834df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
47844df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
47854df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
47864df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
47874df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
47884df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[4] = (unsigned long)(arg4);                         \
47894df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[5] = (unsigned long)(arg5);                         \
47904df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[6] = (unsigned long)(arg6);                         \
47914df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[7] = (unsigned long)(arg7);                         \
47924df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[8] = (unsigned long)(arg8);                         \
47934df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[9] = (unsigned long)(arg9);                         \
47944df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[10] = (unsigned long)(arg10);                       \
47954df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
47964df0bfc0614379192c780c944415dc420d9cfe8epetarj         "dsubu $29, $29, 16\n\t"                                 \
47974df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 72(%1)\n\t"                                      \
47984df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 0($29)\n\t"                                      \
47994df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 80(%1)\n\t"                                      \
48004df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 8($29)\n\t"                                      \
48014df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
48024df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
48034df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
48044df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $7, 32(%1)\n\t"                                      \
48054df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $8, 40(%1)\n\t"                                      \
48064df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $9, 48(%1)\n\t"                                      \
48074df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $10, 56(%1)\n\t"                                     \
48084df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $11, 64(%1)\n\t"                                     \
48094df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
48104df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
48114df0bfc0614379192c780c944415dc420d9cfe8epetarj         "daddu $29, $29, 16\n\t"                                 \
48124df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
48134df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
48144df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
48154df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
48164df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
48174df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
48184df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
48194df0bfc0614379192c780c944415dc420d9cfe8epetarj
48204df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
48214df0bfc0614379192c780c944415dc420d9cfe8epetarj                                  arg6,arg7,arg8,arg9,arg10,      \
48224df0bfc0614379192c780c944415dc420d9cfe8epetarj                                  arg11)                          \
48234df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
48244df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
48254df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[12];                         \
48264df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
48274df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
48284df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
48294df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
48304df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
48314df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[4] = (unsigned long)(arg4);                         \
48324df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[5] = (unsigned long)(arg5);                         \
48334df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[6] = (unsigned long)(arg6);                         \
48344df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[7] = (unsigned long)(arg7);                         \
48354df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[8] = (unsigned long)(arg8);                         \
48364df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[9] = (unsigned long)(arg9);                         \
48374df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[10] = (unsigned long)(arg10);                       \
48384df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[11] = (unsigned long)(arg11);                       \
48394df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
48404df0bfc0614379192c780c944415dc420d9cfe8epetarj         "dsubu $29, $29, 24\n\t"                                 \
48414df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 72(%1)\n\t"                                      \
48424df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 0($29)\n\t"                                      \
48434df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 80(%1)\n\t"                                      \
48444df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 8($29)\n\t"                                      \
48454df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 88(%1)\n\t"                                      \
48464df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 16($29)\n\t"                                     \
48474df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
48484df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
48494df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
48504df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $7, 32(%1)\n\t"                                      \
48514df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $8, 40(%1)\n\t"                                      \
48524df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $9, 48(%1)\n\t"                                      \
48534df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $10, 56(%1)\n\t"                                     \
48544df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $11, 64(%1)\n\t"                                     \
48554df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
48564df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
48574df0bfc0614379192c780c944415dc420d9cfe8epetarj         "daddu $29, $29, 24\n\t"                                 \
48584df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
48594df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
48604df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
48614df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
48624df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
48634df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
48644df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
48654df0bfc0614379192c780c944415dc420d9cfe8epetarj
48664df0bfc0614379192c780c944415dc420d9cfe8epetarj#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
48674df0bfc0614379192c780c944415dc420d9cfe8epetarj                                  arg6,arg7,arg8,arg9,arg10,      \
48684df0bfc0614379192c780c944415dc420d9cfe8epetarj                                  arg11,arg12)                    \
48694df0bfc0614379192c780c944415dc420d9cfe8epetarj   do {                                                           \
48704df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile OrigFn        _orig = (orig);                      \
48714df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _argvec[13];                         \
48724df0bfc0614379192c780c944415dc420d9cfe8epetarj      volatile unsigned long _res;                                \
48734df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[0] = (unsigned long)_orig.nraddr;                   \
48744df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[1] = (unsigned long)(arg1);                         \
48754df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[2] = (unsigned long)(arg2);                         \
48764df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[3] = (unsigned long)(arg3);                         \
48774df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[4] = (unsigned long)(arg4);                         \
48784df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[5] = (unsigned long)(arg5);                         \
48794df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[6] = (unsigned long)(arg6);                         \
48804df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[7] = (unsigned long)(arg7);                         \
48814df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[8] = (unsigned long)(arg8);                         \
48824df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[9] = (unsigned long)(arg9);                         \
48834df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[10] = (unsigned long)(arg10);                       \
48844df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[11] = (unsigned long)(arg11);                       \
48854df0bfc0614379192c780c944415dc420d9cfe8epetarj      _argvec[12] = (unsigned long)(arg12);                       \
48864df0bfc0614379192c780c944415dc420d9cfe8epetarj      __asm__ volatile(                                           \
48874df0bfc0614379192c780c944415dc420d9cfe8epetarj         "dsubu $29, $29, 32\n\t"                                 \
48884df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 72(%1)\n\t"                                      \
48894df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 0($29)\n\t"                                      \
48904df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 80(%1)\n\t"                                      \
48914df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 8($29)\n\t"                                      \
48924df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 88(%1)\n\t"                                      \
48934df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 16($29)\n\t"                                     \
48944df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 96(%1)\n\t"                                      \
48954df0bfc0614379192c780c944415dc420d9cfe8epetarj         "sd $4, 24($29)\n\t"                                     \
48964df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $4, 8(%1)\n\t"                                       \
48974df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $5, 16(%1)\n\t"                                      \
48984df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $6, 24(%1)\n\t"                                      \
48994df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $7, 32(%1)\n\t"                                      \
49004df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $8, 40(%1)\n\t"                                      \
49014df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $9, 48(%1)\n\t"                                      \
49024df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $10, 56(%1)\n\t"                                     \
49034df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $11, 64(%1)\n\t"                                     \
49044df0bfc0614379192c780c944415dc420d9cfe8epetarj         "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
49054df0bfc0614379192c780c944415dc420d9cfe8epetarj         VALGRIND_CALL_NOREDIR_T9                                 \
49064df0bfc0614379192c780c944415dc420d9cfe8epetarj         "daddu $29, $29, 32\n\t"                                 \
49074df0bfc0614379192c780c944415dc420d9cfe8epetarj         "move %0, $2\n"                                          \
49084df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*out*/   "=r" (_res)                                  \
49094df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*in*/    "r" (&_argvec[0])                            \
49104df0bfc0614379192c780c944415dc420d9cfe8epetarj         : /*trash*/ "memory", __CALLER_SAVED_REGS                \
49114df0bfc0614379192c780c944415dc420d9cfe8epetarj      );                                                          \
49124df0bfc0614379192c780c944415dc420d9cfe8epetarj      lval = (__typeof__(lval)) _res;                             \
49134df0bfc0614379192c780c944415dc420d9cfe8epetarj   } while (0)
49144df0bfc0614379192c780c944415dc420d9cfe8epetarj
49154df0bfc0614379192c780c944415dc420d9cfe8epetarj#endif /* PLAT_mips64_linux */
49164df0bfc0614379192c780c944415dc420d9cfe8epetarj
49170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
49180ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* ------------------------------------------------------------------ */
49190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS.               */
49200ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/*                                                                    */
492130d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn/* ------------------------------------------------------------------ */
492230d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn
49232e93c50dc50235189661b70e3f27a4098d5cccccsewardj/* Some request codes.  There are many more of these, but most are not
49242e93c50dc50235189661b70e3f27a4098d5cccccsewardj   exposed to end-user view.  These are the public ones, all of the
4925e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   form 0x1000 + small_number.
4926d799418996812817596beaa8b59563e3f3cb2ddanjn
49270ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   Core ones are in the range 0x00000000--0x0000ffff.  The non-public
49280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   ones start at 0x2000.
49292e93c50dc50235189661b70e3f27a4098d5cccccsewardj*/
49302e93c50dc50235189661b70e3f27a4098d5cccccsewardj
49310ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* These macros are used by tools -- they must be public, but don't
49320ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   embed them into other programs. */
4933fc26ff9ed636a3dd79ee3d90e5e521bc7749f105njn#define VG_USERREQ_TOOL_BASE(a,b) \
49344c791211835f0e90cbde578187c06e563de3b023njn   ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
4935fc26ff9ed636a3dd79ee3d90e5e521bc7749f105njn#define VG_IS_TOOL_USERREQ(a, b, v) \
4936fc26ff9ed636a3dd79ee3d90e5e521bc7749f105njn   (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
493734042515c1715b3e0c5c0a5e0bd033e9d4858f01sewardj
49385ce4b150ce5d32c9af07a24717081ea34568388asewardj/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
49395ce4b150ce5d32c9af07a24717081ea34568388asewardj   This enum comprises an ABI exported by Valgrind to programs
49405ce4b150ce5d32c9af07a24717081ea34568388asewardj   which use client requests.  DO NOT CHANGE THE ORDER OF THESE
49415ce4b150ce5d32c9af07a24717081ea34568388asewardj   ENTRIES, NOR DELETE ANY -- add new ones at the end. */
4942e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjntypedef
49434c791211835f0e90cbde578187c06e563de3b023njn   enum { VG_USERREQ__RUNNING_ON_VALGRIND  = 0x1001,
49444c791211835f0e90cbde578187c06e563de3b023njn          VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
49453e88418f808bf2840646504481d6a5be1df16541njn
49460ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          /* These allow any function to be called from the simulated
49470ec07f32bbbb209d749b9974408e6f025ad40b31sewardj             CPU but run on the real CPU.  Nb: the first arg passed to
49480ec07f32bbbb209d749b9974408e6f025ad40b31sewardj             the function is always the ThreadId of the running
49490ec07f32bbbb209d749b9974408e6f025ad40b31sewardj             thread!  So CLIENT_CALL0 actually requires a 1 arg
4950d4795be03ad94334c7517d93d3f5b35a97c7bba0njn             function, etc. */
49514c791211835f0e90cbde578187c06e563de3b023njn          VG_USERREQ__CLIENT_CALL0 = 0x1101,
49524c791211835f0e90cbde578187c06e563de3b023njn          VG_USERREQ__CLIENT_CALL1 = 0x1102,
49534c791211835f0e90cbde578187c06e563de3b023njn          VG_USERREQ__CLIENT_CALL2 = 0x1103,
49544c791211835f0e90cbde578187c06e563de3b023njn          VG_USERREQ__CLIENT_CALL3 = 0x1104,
49553e88418f808bf2840646504481d6a5be1df16541njn
49560ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          /* Can be useful in regression testing suites -- eg. can
49570ec07f32bbbb209d749b9974408e6f025ad40b31sewardj             send Valgrind's output to /dev/null and still count
49580ec07f32bbbb209d749b9974408e6f025ad40b31sewardj             errors. */
49594c791211835f0e90cbde578187c06e563de3b023njn          VG_USERREQ__COUNT_ERRORS = 0x1201,
496047363aba8fa03b094195bca99fc232ce5f85605dnjn
496146207652a0c99a2c8b0f05eafce3ca3ec533c121philippe          /* Allows the client program and/or gdbserver to execute a monitor
496246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe             command. */
49633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj          VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202,
49643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
49650ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          /* These are useful and can be interpreted by any tool that
49660ec07f32bbbb209d749b9974408e6f025ad40b31sewardj             tracks malloc() et al, by using vg_replace_malloc.c. */
4967d799418996812817596beaa8b59563e3f3cb2ddanjn          VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
4968913473803432ee37d6edaf232e21978d4f426125bart          VG_USERREQ__RESIZEINPLACE_BLOCK = 0x130b,
4969d799418996812817596beaa8b59563e3f3cb2ddanjn          VG_USERREQ__FREELIKE_BLOCK   = 0x1302,
4970bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh          /* Memory pool support. */
4971bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh          VG_USERREQ__CREATE_MEMPOOL   = 0x1303,
4972bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh          VG_USERREQ__DESTROY_MEMPOOL  = 0x1304,
4973bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh          VG_USERREQ__MEMPOOL_ALLOC    = 0x1305,
4974bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh          VG_USERREQ__MEMPOOL_FREE     = 0x1306,
49752c1c9dfe806d62d43768b23c29799dc6a100cb09sewardj          VG_USERREQ__MEMPOOL_TRIM     = 0x1307,
4976c740d7660ad140b79e561e0d578ab8435a5a5289sewardj          VG_USERREQ__MOVE_MEMPOOL     = 0x1308,
4977c740d7660ad140b79e561e0d578ab8435a5a5289sewardj          VG_USERREQ__MEMPOOL_CHANGE   = 0x1309,
4978c740d7660ad140b79e561e0d578ab8435a5a5289sewardj          VG_USERREQ__MEMPOOL_EXISTS   = 0x130a,
4979d799418996812817596beaa8b59563e3f3cb2ddanjn
498039de4b473801ab10a48e356cddc863212dd28cd1fitzhardinge          /* Allow printfs to valgrind log. */
4981c560fb380ac83ad1957d3fdf92751645a55cf167sewardj          /* The first two pass the va_list argument by value, which
4982c560fb380ac83ad1957d3fdf92751645a55cf167sewardj             assumes it is the same size as or smaller than a UWord,
4983c560fb380ac83ad1957d3fdf92751645a55cf167sewardj             which generally isn't the case.  Hence are deprecated.
4984c560fb380ac83ad1957d3fdf92751645a55cf167sewardj             The second two pass the vargs by reference and so are
4985c560fb380ac83ad1957d3fdf92751645a55cf167sewardj             immune to this problem. */
4986c560fb380ac83ad1957d3fdf92751645a55cf167sewardj          /* both :: char* fmt, va_list vargs (DEPRECATED) */
498730d76c6abc3e7d338b1ca81256fa3ce93eccc09fnjn          VG_USERREQ__PRINTF           = 0x1401,
49880140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh          VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
4989c560fb380ac83ad1957d3fdf92751645a55cf167sewardj          /* both :: char* fmt, va_list* vargs */
4990c560fb380ac83ad1957d3fdf92751645a55cf167sewardj          VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403,
4991c560fb380ac83ad1957d3fdf92751645a55cf167sewardj          VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404,
49920140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh
49930140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh          /* Stack support. */
49940140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh          VG_USERREQ__STACK_REGISTER   = 0x1501,
49950140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh          VG_USERREQ__STACK_DEREGISTER = 0x1502,
4996c8259b85b701d25d72aabe9dc0a8154517f96913sewardj          VG_USERREQ__STACK_CHANGE     = 0x1503,
4997c8259b85b701d25d72aabe9dc0a8154517f96913sewardj
4998c8259b85b701d25d72aabe9dc0a8154517f96913sewardj          /* Wine support */
49995c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj          VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601,
50005c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj
50015c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj          /* Querying of debug info. */
5002dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj          VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701,
5003dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj
5004dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj          /* Disable/enable error reporting level.  Takes a single
5005dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj             Word arg which is the delta to this thread's error
5006dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj             disablement indicator.  Hence 1 disables or further
5007dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj             disables errors, and -1 moves back towards enablement.
5008dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj             Other values are not allowed. */
5009bb913cd4cc1e56d7d7798a8b754361a05d01f916florian          VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801,
5010bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
5011bb913cd4cc1e56d7d7798a8b754361a05d01f916florian          /* Initialise IR injection */
5012bb913cd4cc1e56d7d7798a8b754361a05d01f916florian          VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901
5013e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   } Vg_ClientRequest;
50142e93c50dc50235189661b70e3f27a4098d5cccccsewardj
50150ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#if !defined(__GNUC__)
50160ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#  define __extension__ /* */
5017c9b365507e9bd5d500476e3e83f4d30f9c68a351mueller#endif
50182e93c50dc50235189661b70e3f27a4098d5cccccsewardj
5019fa5115adb77868b1ee3efc8dce061b881e7833c5bart
50200ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* Returns the number of Valgrinds this code is running under.  That
50210ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   is, 0 if running natively, 1 if running under Valgrind, 2 if
50220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   running under Valgrind which is running under another Valgrind,
50230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   etc. */
5024fa5115adb77868b1ee3efc8dce061b881e7833c5bart#define RUNNING_ON_VALGRIND                                           \
5025575ce8ef8fa86a502dabe152293320676922dcfebart    (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */,         \
5026fa5115adb77868b1ee3efc8dce061b881e7833c5bart                                    VG_USERREQ__RUNNING_ON_VALGRIND,  \
5027fa5115adb77868b1ee3efc8dce061b881e7833c5bart                                    0, 0, 0, 0, 0)                    \
5028de4a1d01951937632098a6cda45859afa587a06fsewardj
5029de4a1d01951937632098a6cda45859afa587a06fsewardj
503018d7513cc08bf982711c8a22b70d56af6aa87b33sewardj/* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
503118d7513cc08bf982711c8a22b70d56af6aa87b33sewardj   _qzz_len - 1].  Useful if you are debugging a JITter or some such,
503218d7513cc08bf982711c8a22b70d56af6aa87b33sewardj   since it provides a way to make sure valgrind will retranslate the
503318d7513cc08bf982711c8a22b70d56af6aa87b33sewardj   invalidated area.  Returns no value. */
50344b3a74204894e943c43cb8e8aae39d813040702csewardj#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len)              \
50354b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS,  \
50364b3a74204894e943c43cb8e8aae39d813040702csewardj                                    _qzz_addr, _qzz_len, 0, 0, 0)
503718d7513cc08bf982711c8a22b70d56af6aa87b33sewardj
503826aba4d3ef6cebc34879e82d88bcbe3c3b3b9f9enjn
50390ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* These requests are for getting Valgrind itself to print something.
5040d55f0d924062c7b5b3453242a6f9611bd5ce7458njn   Possibly with a backtrace.  This is a really ugly hack.  The return value
5041d55f0d924062c7b5b3453242a6f9611bd5ce7458njn   is the number of characters printed, excluding the "**<pid>** " part at the
5042d55f0d924062c7b5b3453242a6f9611bd5ce7458njn   start and the backtrace (if present). */
50430ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
504442f83fe6c64da13801d4eb54fa2aa6530679848abart#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
50457eca0cc8e2bc1c260be1b596c54e4b55d1e2517asewardj/* Modern GCC will optimize the static routine out if unused,
50467eca0cc8e2bc1c260be1b596c54e4b55d1e2517asewardj   and unused attribute will shut down warnings about it.  */
50477eca0cc8e2bc1c260be1b596c54e4b55d1e2517asewardjstatic int VALGRIND_PRINTF(const char *format, ...)
50487eca0cc8e2bc1c260be1b596c54e4b55d1e2517asewardj   __attribute__((format(__printf__, 1, 2), __unused__));
50497f489813d200fb614a0856fca05e2f9ebf66dd48bart#endif
50507eca0cc8e2bc1c260be1b596c54e4b55d1e2517asewardjstatic int
50510da2c772047f3f6795dbb43dde5f5c9b43be73bbbart#if defined(_MSC_VER)
50520da2c772047f3f6795dbb43dde5f5c9b43be73bbbart__inline
50530da2c772047f3f6795dbb43dde5f5c9b43be73bbbart#endif
5054a09a1b5d4e02b7451345dac00f2d321d1b4b2ccefitzhardingeVALGRIND_PRINTF(const char *format, ...)
505539de4b473801ab10a48e356cddc863212dd28cd1fitzhardinge{
50568c7e25f496b1771f21712db0b1f35935bacfaff3bart#if defined(NVALGRIND)
50578c7e25f496b1771f21712db0b1f35935bacfaff3bart   return 0;
50588c7e25f496b1771f21712db0b1f35935bacfaff3bart#else /* NVALGRIND */
5059aaaf21d21f5803b6b1a0fc558bb8db0fcb83a7a0bart#if defined(_MSC_VER) || defined(__MINGW64__)
5060575ce8ef8fa86a502dabe152293320676922dcfebart   uintptr_t _qzz_res;
5061575ce8ef8fa86a502dabe152293320676922dcfebart#else
5062c616819253fcf211745060b2be26076174b1df19njn   unsigned long _qzz_res;
5063575ce8ef8fa86a502dabe152293320676922dcfebart#endif
5064c560fb380ac83ad1957d3fdf92751645a55cf167sewardj   va_list vargs;
5065c560fb380ac83ad1957d3fdf92751645a55cf167sewardj   va_start(vargs, format);
5066aaaf21d21f5803b6b1a0fc558bb8db0fcb83a7a0bart#if defined(_MSC_VER) || defined(__MINGW64__)
5067575ce8ef8fa86a502dabe152293320676922dcfebart   _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
50680da2c772047f3f6795dbb43dde5f5c9b43be73bbbart                              VG_USERREQ__PRINTF_VALIST_BY_REF,
5069fa5115adb77868b1ee3efc8dce061b881e7833c5bart                              (uintptr_t)format,
5070fa5115adb77868b1ee3efc8dce061b881e7833c5bart                              (uintptr_t)&vargs,
50710da2c772047f3f6795dbb43dde5f5c9b43be73bbbart                              0, 0, 0);
50720da2c772047f3f6795dbb43dde5f5c9b43be73bbbart#else
5073575ce8ef8fa86a502dabe152293320676922dcfebart   _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
5074c560fb380ac83ad1957d3fdf92751645a55cf167sewardj                              VG_USERREQ__PRINTF_VALIST_BY_REF,
507505b07158841423adc250f04e034bf11e6f892b23sewardj                              (unsigned long)format,
5076c560fb380ac83ad1957d3fdf92751645a55cf167sewardj                              (unsigned long)&vargs,
50779af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj                              0, 0, 0);
50780da2c772047f3f6795dbb43dde5f5c9b43be73bbbart#endif
5079c560fb380ac83ad1957d3fdf92751645a55cf167sewardj   va_end(vargs);
5080c616819253fcf211745060b2be26076174b1df19njn   return (int)_qzz_res;
50818c7e25f496b1771f21712db0b1f35935bacfaff3bart#endif /* NVALGRIND */
508239de4b473801ab10a48e356cddc863212dd28cd1fitzhardinge}
508339de4b473801ab10a48e356cddc863212dd28cd1fitzhardinge
508442f83fe6c64da13801d4eb54fa2aa6530679848abart#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
50857eca0cc8e2bc1c260be1b596c54e4b55d1e2517asewardjstatic int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
50867eca0cc8e2bc1c260be1b596c54e4b55d1e2517asewardj   __attribute__((format(__printf__, 1, 2), __unused__));
50877f489813d200fb614a0856fca05e2f9ebf66dd48bart#endif
50887eca0cc8e2bc1c260be1b596c54e4b55d1e2517asewardjstatic int
50890da2c772047f3f6795dbb43dde5f5c9b43be73bbbart#if defined(_MSC_VER)
50900da2c772047f3f6795dbb43dde5f5c9b43be73bbbart__inline
50910da2c772047f3f6795dbb43dde5f5c9b43be73bbbart#endif
5092a09a1b5d4e02b7451345dac00f2d321d1b4b2ccefitzhardingeVALGRIND_PRINTF_BACKTRACE(const char *format, ...)
509339de4b473801ab10a48e356cddc863212dd28cd1fitzhardinge{
50948c7e25f496b1771f21712db0b1f35935bacfaff3bart#if defined(NVALGRIND)
50958c7e25f496b1771f21712db0b1f35935bacfaff3bart   return 0;
50968c7e25f496b1771f21712db0b1f35935bacfaff3bart#else /* NVALGRIND */
5097aaaf21d21f5803b6b1a0fc558bb8db0fcb83a7a0bart#if defined(_MSC_VER) || defined(__MINGW64__)
5098575ce8ef8fa86a502dabe152293320676922dcfebart   uintptr_t _qzz_res;
5099575ce8ef8fa86a502dabe152293320676922dcfebart#else
5100c616819253fcf211745060b2be26076174b1df19njn   unsigned long _qzz_res;
5101575ce8ef8fa86a502dabe152293320676922dcfebart#endif
5102c560fb380ac83ad1957d3fdf92751645a55cf167sewardj   va_list vargs;
5103c560fb380ac83ad1957d3fdf92751645a55cf167sewardj   va_start(vargs, format);
5104aaaf21d21f5803b6b1a0fc558bb8db0fcb83a7a0bart#if defined(_MSC_VER) || defined(__MINGW64__)
5105575ce8ef8fa86a502dabe152293320676922dcfebart   _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
51060da2c772047f3f6795dbb43dde5f5c9b43be73bbbart                              VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
5107fa5115adb77868b1ee3efc8dce061b881e7833c5bart                              (uintptr_t)format,
5108fa5115adb77868b1ee3efc8dce061b881e7833c5bart                              (uintptr_t)&vargs,
51090da2c772047f3f6795dbb43dde5f5c9b43be73bbbart                              0, 0, 0);
51100da2c772047f3f6795dbb43dde5f5c9b43be73bbbart#else
5111575ce8ef8fa86a502dabe152293320676922dcfebart   _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
5112c560fb380ac83ad1957d3fdf92751645a55cf167sewardj                              VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
511305b07158841423adc250f04e034bf11e6f892b23sewardj                              (unsigned long)format,
5114c560fb380ac83ad1957d3fdf92751645a55cf167sewardj                              (unsigned long)&vargs,
51159af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj                              0, 0, 0);
51160da2c772047f3f6795dbb43dde5f5c9b43be73bbbart#endif
5117c560fb380ac83ad1957d3fdf92751645a55cf167sewardj   va_end(vargs);
5118c616819253fcf211745060b2be26076174b1df19njn   return (int)_qzz_res;
511939de4b473801ab10a48e356cddc863212dd28cd1fitzhardinge#endif /* NVALGRIND */
51208c7e25f496b1771f21712db0b1f35935bacfaff3bart}
512118d7513cc08bf982711c8a22b70d56af6aa87b33sewardj
51220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
51233e88418f808bf2840646504481d6a5be1df16541njn/* These requests allow control to move from the simulated CPU to the
51241319b49115bd0763628273b8a3fe08ac30712e31njn   real CPU, calling an arbitary function.
51251319b49115bd0763628273b8a3fe08ac30712e31njn
51261319b49115bd0763628273b8a3fe08ac30712e31njn   Note that the current ThreadId is inserted as the first argument.
51271319b49115bd0763628273b8a3fe08ac30712e31njn   So this call:
51281319b49115bd0763628273b8a3fe08ac30712e31njn
51291319b49115bd0763628273b8a3fe08ac30712e31njn     VALGRIND_NON_SIMD_CALL2(f, arg1, arg2)
51301319b49115bd0763628273b8a3fe08ac30712e31njn
51311319b49115bd0763628273b8a3fe08ac30712e31njn   requires f to have this signature:
51321319b49115bd0763628273b8a3fe08ac30712e31njn
51331319b49115bd0763628273b8a3fe08ac30712e31njn     Word f(Word tid, Word arg1, Word arg2)
51341319b49115bd0763628273b8a3fe08ac30712e31njn
51351319b49115bd0763628273b8a3fe08ac30712e31njn   where "Word" is a word-sized type.
513645fb4d304f59e4e4cca917d372278eeb75be2c33njn
513745fb4d304f59e4e4cca917d372278eeb75be2c33njn   Note that these client requests are not entirely reliable.  For example,
513845fb4d304f59e4e4cca917d372278eeb75be2c33njn   if you call a function with them that subsequently calls printf(),
513945fb4d304f59e4e4cca917d372278eeb75be2c33njn   there's a high chance Valgrind will crash.  Generally, your prospects of
514045fb4d304f59e4e4cca917d372278eeb75be2c33njn   these working are made higher if the called function does not refer to
514145fb4d304f59e4e4cca917d372278eeb75be2c33njn   any global variables, and does not refer to any libc or other functions
514245fb4d304f59e4e4cca917d372278eeb75be2c33njn   (printf et al).  Any kind of entanglement with libc or dynamic linking is
514345fb4d304f59e4e4cca917d372278eeb75be2c33njn   likely to have a bad outcome, for tricky reasons which we've grappled
514445fb4d304f59e4e4cca917d372278eeb75be2c33njn   with a lot in the past.
51451319b49115bd0763628273b8a3fe08ac30712e31njn*/
51460ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_NON_SIMD_CALL0(_qyy_fn)                          \
5147575ce8ef8fa86a502dabe152293320676922dcfebart    VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,       \
5148575ce8ef8fa86a502dabe152293320676922dcfebart                                    VG_USERREQ__CLIENT_CALL0,     \
5149575ce8ef8fa86a502dabe152293320676922dcfebart                                    _qyy_fn,                      \
5150575ce8ef8fa86a502dabe152293320676922dcfebart                                    0, 0, 0, 0)
5151575ce8ef8fa86a502dabe152293320676922dcfebart
5152575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1)                    \
5153575ce8ef8fa86a502dabe152293320676922dcfebart    VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,            \
5154575ce8ef8fa86a502dabe152293320676922dcfebart                                    VG_USERREQ__CLIENT_CALL1,          \
5155575ce8ef8fa86a502dabe152293320676922dcfebart                                    _qyy_fn,                           \
5156575ce8ef8fa86a502dabe152293320676922dcfebart                                    _qyy_arg1, 0, 0, 0)
5157575ce8ef8fa86a502dabe152293320676922dcfebart
5158575ce8ef8fa86a502dabe152293320676922dcfebart#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2)         \
5159575ce8ef8fa86a502dabe152293320676922dcfebart    VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,            \
5160575ce8ef8fa86a502dabe152293320676922dcfebart                                    VG_USERREQ__CLIENT_CALL2,          \
5161575ce8ef8fa86a502dabe152293320676922dcfebart                                    _qyy_fn,                           \
5162575ce8ef8fa86a502dabe152293320676922dcfebart                                    _qyy_arg1, _qyy_arg2, 0, 0)
51633e88418f808bf2840646504481d6a5be1df16541njn
51640ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
5165575ce8ef8fa86a502dabe152293320676922dcfebart    VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,             \
5166575ce8ef8fa86a502dabe152293320676922dcfebart                                    VG_USERREQ__CLIENT_CALL3,           \
5167575ce8ef8fa86a502dabe152293320676922dcfebart                                    _qyy_fn,                            \
5168575ce8ef8fa86a502dabe152293320676922dcfebart                                    _qyy_arg1, _qyy_arg2,               \
5169575ce8ef8fa86a502dabe152293320676922dcfebart                                    _qyy_arg3, 0)
51703e88418f808bf2840646504481d6a5be1df16541njn
51713e88418f808bf2840646504481d6a5be1df16541njn
51727cc9c239f785f2903b597cdb34418bed42d25331nethercote/* Counts the number of errors that have been recorded by a tool.  Nb:
51737cc9c239f785f2903b597cdb34418bed42d25331nethercote   the tool must record the errors with VG_(maybe_record_error)() or
517447363aba8fa03b094195bca99fc232ce5f85605dnjn   VG_(unique_error)() for them to be counted. */
51750ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_COUNT_ERRORS                                     \
5176575ce8ef8fa86a502dabe152293320676922dcfebart    (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(                    \
5177575ce8ef8fa86a502dabe152293320676922dcfebart                               0 /* default return */,            \
51780ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                               VG_USERREQ__COUNT_ERRORS,          \
5179575ce8ef8fa86a502dabe152293320676922dcfebart                               0, 0, 0, 0, 0)
518047363aba8fa03b094195bca99fc232ce5f85605dnjn
51813ac96953bf8c912a2aaa2870652dda8b9b75337bnjn/* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing
51823ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   when heap blocks are allocated in order to give accurate results.  This
51833ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   happens automatically for the standard allocator functions such as
51843ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete,
51853ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   delete[], etc.
51863ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
51873ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   But if your program uses a custom allocator, this doesn't automatically
51883ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   happen, and Valgrind will not do as well.  For example, if you allocate
51893ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   superblocks with mmap() and then allocates chunks of the superblocks, all
51903ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   Valgrind's observations will be at the mmap() level and it won't know that
51913ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   the chunks should be considered separate entities.  In Memcheck's case,
51923ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   that means you probably won't get heap block overrun detection (because
51933ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   there won't be redzones marked as unaddressable) and you definitely won't
51943ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   get any leak detection.
51953ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
51963ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   The following client requests allow a custom allocator to be annotated so
51973ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   that it can be handled accurately by Valgrind.
51983ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
51993ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated
52003ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   by a malloc()-like function.  For Memcheck (an illustrative case), this
52013ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   does two things:
52023ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
52033ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   - It records that the block has been allocated.  This means any addresses
52043ac96953bf8c912a2aaa2870652dda8b9b75337bnjn     within the block mentioned in error messages will be
52053ac96953bf8c912a2aaa2870652dda8b9b75337bnjn     identified as belonging to the block.  It also means that if the block
52063ac96953bf8c912a2aaa2870652dda8b9b75337bnjn     isn't freed it will be detected by the leak checker.
52073ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
52083ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   - It marks the block as being addressable and undefined (if 'is_zeroed' is
52093ac96953bf8c912a2aaa2870652dda8b9b75337bnjn     not set), or addressable and defined (if 'is_zeroed' is set).  This
52103ac96953bf8c912a2aaa2870652dda8b9b75337bnjn     controls how accesses to the block by the program are handled.
52113ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
52123ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   'addr' is the start of the usable block (ie. after any
52133ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   redzone), 'sizeB' is its size.  'rzB' is the redzone size if the allocator
52143ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   can apply redzones -- these are blocks of padding at the start and end of
52153ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   each block.  Adding redzones is recommended as it makes it much more likely
52163ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   Valgrind will spot block overruns.  `is_zeroed' indicates if the memory is
52173ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   zeroed (or filled with another predictable value), as is the case for
52183ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   calloc().
52193ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
52203ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a
52213ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   heap block -- that will be used by the client program -- is allocated.
52223ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   It's best to put it at the outermost level of the allocator if possible;
52233ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   for example, if you have a function my_alloc() which calls
52243ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   internal_alloc(), and the client request is put inside internal_alloc(),
52253ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   stack traces relating to the heap block will contain entries for both
52263ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   my_alloc() and internal_alloc(), which is probably not what you want.
52273ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
5228b965efb4990bdedc3215ffcca8ea566d25874d26njn   For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out
5229b965efb4990bdedc3215ffcca8ea566d25874d26njn   custom blocks from within a heap block, B, that has been allocated with
5230b965efb4990bdedc3215ffcca8ea566d25874d26njn   malloc/calloc/new/etc, then block B will be *ignored* during leak-checking
5231b965efb4990bdedc3215ffcca8ea566d25874d26njn   -- the custom blocks will take precedence.
5232b965efb4990bdedc3215ffcca8ea566d25874d26njn
52333ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK.  For
52343ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   Memcheck, it does two things:
52353ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
52363ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   - It records that the block has been deallocated.  This assumes that the
52373ac96953bf8c912a2aaa2870652dda8b9b75337bnjn     block was annotated as having been allocated via
52383ac96953bf8c912a2aaa2870652dda8b9b75337bnjn     VALGRIND_MALLOCLIKE_BLOCK.  Otherwise, an error will be issued.
52393ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
52403ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   - It marks the block as being unaddressable.
52413ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
52423ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a
52433ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   heap block is deallocated.
52443ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
5245913473803432ee37d6edaf232e21978d4f426125bart   VALGRIND_RESIZEINPLACE_BLOCK informs a tool about reallocation. For
5246913473803432ee37d6edaf232e21978d4f426125bart   Memcheck, it does four things:
5247913473803432ee37d6edaf232e21978d4f426125bart
5248913473803432ee37d6edaf232e21978d4f426125bart   - It records that the size of a block has been changed.  This assumes that
5249913473803432ee37d6edaf232e21978d4f426125bart     the block was annotated as having been allocated via
5250913473803432ee37d6edaf232e21978d4f426125bart     VALGRIND_MALLOCLIKE_BLOCK.  Otherwise, an error will be issued.
5251913473803432ee37d6edaf232e21978d4f426125bart
5252913473803432ee37d6edaf232e21978d4f426125bart   - If the block shrunk, it marks the freed memory as being unaddressable.
5253913473803432ee37d6edaf232e21978d4f426125bart
5254913473803432ee37d6edaf232e21978d4f426125bart   - If the block grew, it marks the new area as undefined and defines a red
5255913473803432ee37d6edaf232e21978d4f426125bart     zone past the end of the new block.
5256913473803432ee37d6edaf232e21978d4f426125bart
5257913473803432ee37d6edaf232e21978d4f426125bart   - The V-bits of the overlap between the old and the new block are preserved.
5258913473803432ee37d6edaf232e21978d4f426125bart
5259913473803432ee37d6edaf232e21978d4f426125bart   VALGRIND_RESIZEINPLACE_BLOCK should be put after allocation of the new block
5260913473803432ee37d6edaf232e21978d4f426125bart   and before deallocation of the old block.
5261913473803432ee37d6edaf232e21978d4f426125bart
5262913473803432ee37d6edaf232e21978d4f426125bart   In many cases, these three client requests will not be enough to get your
52633ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   allocator working well with Memcheck.  More specifically, if your allocator
52643ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call
52653ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   will be necessary to mark the memory as addressable just before the zeroing
52663ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   occurs, otherwise you'll get a lot of invalid write errors.  For example,
52673ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   you'll need to do this if your allocator recycles freed blocks, but it
52683ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK).
52693ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   Alternatively, if your allocator reuses freed blocks for allocator-internal
52703ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary.
52713ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
52723ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   Really, what's happening is a blurring of the lines between the client
52733ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the
52743ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   memory should be considered unaddressable to the client program, but the
52753ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   allocator knows more than the rest of the client program and so may be able
52763ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   to safely access it.  Extra client requests are necessary for Valgrind to
52773ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   understand the distinction between the allocator and the rest of the
52783ac96953bf8c912a2aaa2870652dda8b9b75337bnjn   program.
52793ac96953bf8c912a2aaa2870652dda8b9b75337bnjn
528032f8d8c0dcb3a7c3ff14aa9892ea2410eba3207cnjn   Ignored if addr == 0.
52813ac96953bf8c912a2aaa2870652dda8b9b75337bnjn*/
52824b3a74204894e943c43cb8e8aae39d813040702csewardj#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)          \
52834b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK,       \
52844b3a74204894e943c43cb8e8aae39d813040702csewardj                                    addr, sizeB, rzB, is_zeroed, 0)
5285d799418996812817596beaa8b59563e3f3cb2ddanjn
528632f8d8c0dcb3a7c3ff14aa9892ea2410eba3207cnjn/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
528732f8d8c0dcb3a7c3ff14aa9892ea2410eba3207cnjn   Ignored if addr == 0.
528832f8d8c0dcb3a7c3ff14aa9892ea2410eba3207cnjn*/
52894b3a74204894e943c43cb8e8aae39d813040702csewardj#define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB)     \
52904b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK,    \
52914b3a74204894e943c43cb8e8aae39d813040702csewardj                                    addr, oldSizeB, newSizeB, rzB, 0)
5292913473803432ee37d6edaf232e21978d4f426125bart
5293913473803432ee37d6edaf232e21978d4f426125bart/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
5294913473803432ee37d6edaf232e21978d4f426125bart   Ignored if addr == 0.
5295913473803432ee37d6edaf232e21978d4f426125bart*/
52964b3a74204894e943c43cb8e8aae39d813040702csewardj#define VALGRIND_FREELIKE_BLOCK(addr, rzB)                              \
52974b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK,         \
52984b3a74204894e943c43cb8e8aae39d813040702csewardj                                    addr, rzB, 0, 0, 0)
5299d799418996812817596beaa8b59563e3f3cb2ddanjn
5300bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh/* Create a memory pool. */
53010ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed)             \
53024b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL,   \
53034b3a74204894e943c43cb8e8aae39d813040702csewardj                                    pool, rzB, is_zeroed, 0, 0)
5304bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh
5305bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh/* Destroy a memory pool. */
53060ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_DESTROY_MEMPOOL(pool)                            \
53074b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL,  \
53084b3a74204894e943c43cb8e8aae39d813040702csewardj                                    pool, 0, 0, 0, 0)
5309bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh
5310bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh/* Associate a piece of memory with a memory pool. */
53110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size)                  \
53124b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC,    \
53134b3a74204894e943c43cb8e8aae39d813040702csewardj                                    pool, addr, size, 0, 0)
5314bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh
5315bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh/* Disassociate a piece of memory from a memory pool. */
53160ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_MEMPOOL_FREE(pool, addr)                         \
53174b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE,     \
53184b3a74204894e943c43cb8e8aae39d813040702csewardj                                    pool, addr, 0, 0, 0)
5319bc0bb8302c37c0c24aafbcfde0cc96d2c2805c94rjwalsh
53202c1c9dfe806d62d43768b23c29799dc6a100cb09sewardj/* Disassociate any pieces outside a particular range. */
53212c1c9dfe806d62d43768b23c29799dc6a100cb09sewardj#define VALGRIND_MEMPOOL_TRIM(pool, addr, size)                   \
53224b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM,     \
53234b3a74204894e943c43cb8e8aae39d813040702csewardj                                    pool, addr, size, 0, 0)
53242c1c9dfe806d62d43768b23c29799dc6a100cb09sewardj
5325c740d7660ad140b79e561e0d578ab8435a5a5289sewardj/* Resize and/or move a piece associated with a memory pool. */
5326c740d7660ad140b79e561e0d578ab8435a5a5289sewardj#define VALGRIND_MOVE_MEMPOOL(poolA, poolB)                       \
53274b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL,     \
53284b3a74204894e943c43cb8e8aae39d813040702csewardj                                    poolA, poolB, 0, 0, 0)
5329c740d7660ad140b79e561e0d578ab8435a5a5289sewardj
5330c740d7660ad140b79e561e0d578ab8435a5a5289sewardj/* Resize and/or move a piece associated with a memory pool. */
5331c740d7660ad140b79e561e0d578ab8435a5a5289sewardj#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size)         \
53324b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE,   \
53334b3a74204894e943c43cb8e8aae39d813040702csewardj                                    pool, addrA, addrB, size, 0)
5334c740d7660ad140b79e561e0d578ab8435a5a5289sewardj
5335c740d7660ad140b79e561e0d578ab8435a5a5289sewardj/* Return 1 if a mempool exists, else 0. */
5336c740d7660ad140b79e561e0d578ab8435a5a5289sewardj#define VALGRIND_MEMPOOL_EXISTS(pool)                             \
5337575ce8ef8fa86a502dabe152293320676922dcfebart    (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                  \
5338c740d7660ad140b79e561e0d578ab8435a5a5289sewardj                               VG_USERREQ__MEMPOOL_EXISTS,        \
5339575ce8ef8fa86a502dabe152293320676922dcfebart                               pool, 0, 0, 0, 0)
5340c740d7660ad140b79e561e0d578ab8435a5a5289sewardj
53410140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh/* Mark a piece of memory as being a stack. Returns a stack id. */
53420ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_STACK_REGISTER(start, end)                       \
5343575ce8ef8fa86a502dabe152293320676922dcfebart    (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                  \
53440ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                               VG_USERREQ__STACK_REGISTER,        \
5345575ce8ef8fa86a502dabe152293320676922dcfebart                               start, end, 0, 0, 0)
53460140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh
53470140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh/* Unmark the piece of memory associated with a stack id as being a
53480140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh   stack. */
53490ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_STACK_DEREGISTER(id)                             \
53504b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \
53514b3a74204894e943c43cb8e8aae39d813040702csewardj                                    id, 0, 0, 0, 0)
53520140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh
53530140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh/* Change the start and end address of the stack id. */
53540ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#define VALGRIND_STACK_CHANGE(id, start, end)                     \
53554b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE,     \
53564b3a74204894e943c43cb8e8aae39d813040702csewardj                                    id, start, end, 0, 0)
53570140af5b913b1a57b5c28ef776bbb2dda23e8b64rjwalsh
5358c8259b85b701d25d72aabe9dc0a8154517f96913sewardj/* Load PDB debug info for Wine PE image_map. */
53594b3a74204894e943c43cb8e8aae39d813040702csewardj#define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta)     \
53604b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \
53614b3a74204894e943c43cb8e8aae39d813040702csewardj                                    fd, ptr, total_size, delta, 0)
5362c8259b85b701d25d72aabe9dc0a8154517f96913sewardj
53635c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj/* Map a code address to a source file name and line number.  buf64
53645c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj   must point to a 64-byte buffer in the caller's address space.  The
53655c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj   result will be dumped in there and is guaranteed to be zero
53665c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj   terminated.  If no info is found, the first byte is set to zero. */
53675c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj#define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64)                    \
5368575ce8ef8fa86a502dabe152293320676922dcfebart    (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                  \
53695c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj                               VG_USERREQ__MAP_IP_TO_SRCLOC,      \
5370575ce8ef8fa86a502dabe152293320676922dcfebart                               addr, buf64, 0, 0, 0)
53715c65962f59fb226d327a4860dfab27a1b19ce2e3sewardj
5372dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj/* Disable error reporting for this thread.  Behaves in a stack like
5373dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   way, so you can safely call this multiple times provided that
5374dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   VALGRIND_ENABLE_ERROR_REPORTING is called the same number of times
5375dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   to re-enable reporting.  The first call of this macro disables
5376dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   reporting.  Subsequent calls have no effect except to increase the
5377dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   number of VALGRIND_ENABLE_ERROR_REPORTING calls needed to re-enable
5378dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   reporting.  Child threads do not inherit this setting from their
5379dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   parents -- they are always created with reporting enabled. */
538006e9bf06cf953602adaf5e2a0a3f5522e4dc7f50bart#define VALGRIND_DISABLE_ERROR_REPORTING                                \
53814b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
53824b3a74204894e943c43cb8e8aae39d813040702csewardj                                    1, 0, 0, 0, 0)
5383dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj
5384dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj/* Re-enable error reporting, as per comments on
5385dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   VALGRIND_DISABLE_ERROR_REPORTING. */
538606e9bf06cf953602adaf5e2a0a3f5522e4dc7f50bart#define VALGRIND_ENABLE_ERROR_REPORTING                                 \
53874b3a74204894e943c43cb8e8aae39d813040702csewardj    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
53884b3a74204894e943c43cb8e8aae39d813040702csewardj                                    -1, 0, 0, 0, 0)
53890ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
539046207652a0c99a2c8b0f05eafce3ca3ec533c121philippe/* Execute a monitor command from the client program.
539146207652a0c99a2c8b0f05eafce3ca3ec533c121philippe   If a connection is opened with GDB, the output will be sent
539246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe   according to the output mode set for vgdb.
539346207652a0c99a2c8b0f05eafce3ca3ec533c121philippe   If no connection is opened, output will go to the log output.
539446207652a0c99a2c8b0f05eafce3ca3ec533c121philippe   Returns 1 if command not recognised, 0 otherwise. */
539546207652a0c99a2c8b0f05eafce3ca3ec533c121philippe#define VALGRIND_MONITOR_COMMAND(command)                               \
539646207652a0c99a2c8b0f05eafce3ca3ec533c121philippe   VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \
539746207652a0c99a2c8b0f05eafce3ca3ec533c121philippe                                   command, 0, 0, 0, 0)
539846207652a0c99a2c8b0f05eafce3ca3ec533c121philippe
539946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe
5400c112c8ea1262761630f2f17ada4d53697b1242fasewardj#undef PLAT_x86_darwin
5401c112c8ea1262761630f2f17ada4d53697b1242fasewardj#undef PLAT_amd64_darwin
5402c112c8ea1262761630f2f17ada4d53697b1242fasewardj#undef PLAT_x86_win32
5403aaaf21d21f5803b6b1a0fc558bb8db0fcb83a7a0bart#undef PLAT_amd64_win64
5404f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#undef PLAT_x86_linux
5405f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#undef PLAT_amd64_linux
5406f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#undef PLAT_ppc32_linux
5407f5c1a7f5a80a9268b181bf6b73e865eb10688b85sewardj#undef PLAT_ppc64_linux
540859570ffbe31930ab4d678754daaeec0715117a3dsewardj#undef PLAT_arm_linux
5409b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#undef PLAT_s390x_linux
54105db15403e889d4db339b342bc2a824ef0bfaa654sewardj#undef PLAT_mips32_linux
54114df0bfc0614379192c780c944415dc420d9cfe8epetarj#undef PLAT_mips64_linux
54120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
54133e88418f808bf2840646504481d6a5be1df16541njn#endif   /* __VALGRIND_H */
5414