xref: /aosp_15_r20/external/pytorch/third_party/valgrind-headers/valgrind.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker /* -*- c -*-
2*da0073e9SAndroid Build Coastguard Worker    ----------------------------------------------------------------
3*da0073e9SAndroid Build Coastguard Worker 
4*da0073e9SAndroid Build Coastguard Worker    Notice that the following BSD-style license applies to this one
5*da0073e9SAndroid Build Coastguard Worker    file (valgrind.h) only.  The rest of Valgrind is licensed under the
6*da0073e9SAndroid Build Coastguard Worker    terms of the GNU General Public License, version 2, unless
7*da0073e9SAndroid Build Coastguard Worker    otherwise indicated.  See the COPYING file in the source
8*da0073e9SAndroid Build Coastguard Worker    distribution for details.
9*da0073e9SAndroid Build Coastguard Worker 
10*da0073e9SAndroid Build Coastguard Worker    ----------------------------------------------------------------
11*da0073e9SAndroid Build Coastguard Worker 
12*da0073e9SAndroid Build Coastguard Worker    This file is part of Valgrind, a dynamic binary instrumentation
13*da0073e9SAndroid Build Coastguard Worker    framework.
14*da0073e9SAndroid Build Coastguard Worker 
15*da0073e9SAndroid Build Coastguard Worker    Copyright (C) 2000-2017 Julian Seward.  All rights reserved.
16*da0073e9SAndroid Build Coastguard Worker 
17*da0073e9SAndroid Build Coastguard Worker    Redistribution and use in source and binary forms, with or without
18*da0073e9SAndroid Build Coastguard Worker    modification, are permitted provided that the following conditions
19*da0073e9SAndroid Build Coastguard Worker    are met:
20*da0073e9SAndroid Build Coastguard Worker 
21*da0073e9SAndroid Build Coastguard Worker    1. Redistributions of source code must retain the above copyright
22*da0073e9SAndroid Build Coastguard Worker       notice, this list of conditions and the following disclaimer.
23*da0073e9SAndroid Build Coastguard Worker 
24*da0073e9SAndroid Build Coastguard Worker    2. The origin of this software must not be misrepresented; you must
25*da0073e9SAndroid Build Coastguard Worker       not claim that you wrote the original software.  If you use this
26*da0073e9SAndroid Build Coastguard Worker       software in a product, an acknowledgment in the product
27*da0073e9SAndroid Build Coastguard Worker       documentation would be appreciated but is not required.
28*da0073e9SAndroid Build Coastguard Worker 
29*da0073e9SAndroid Build Coastguard Worker    3. Altered source versions must be plainly marked as such, and must
30*da0073e9SAndroid Build Coastguard Worker       not be misrepresented as being the original software.
31*da0073e9SAndroid Build Coastguard Worker 
32*da0073e9SAndroid Build Coastguard Worker    4. The name of the author may not be used to endorse or promote
33*da0073e9SAndroid Build Coastguard Worker       products derived from this software without specific prior written
34*da0073e9SAndroid Build Coastguard Worker       permission.
35*da0073e9SAndroid Build Coastguard Worker 
36*da0073e9SAndroid Build Coastguard Worker    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
37*da0073e9SAndroid Build Coastguard Worker    OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
38*da0073e9SAndroid Build Coastguard Worker    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39*da0073e9SAndroid Build Coastguard Worker    ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
40*da0073e9SAndroid Build Coastguard Worker    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41*da0073e9SAndroid Build Coastguard Worker    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
42*da0073e9SAndroid Build Coastguard Worker    GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
43*da0073e9SAndroid Build Coastguard Worker    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
44*da0073e9SAndroid Build Coastguard Worker    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45*da0073e9SAndroid Build Coastguard Worker    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46*da0073e9SAndroid Build Coastguard Worker    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47*da0073e9SAndroid Build Coastguard Worker 
48*da0073e9SAndroid Build Coastguard Worker    ----------------------------------------------------------------
49*da0073e9SAndroid Build Coastguard Worker 
50*da0073e9SAndroid Build Coastguard Worker    Notice that the above BSD-style license applies to this one file
51*da0073e9SAndroid Build Coastguard Worker    (valgrind.h) only.  The entire rest of Valgrind is licensed under
52*da0073e9SAndroid Build Coastguard Worker    the terms of the GNU General Public License, version 2.  See the
53*da0073e9SAndroid Build Coastguard Worker    COPYING file in the source distribution for details.
54*da0073e9SAndroid Build Coastguard Worker 
55*da0073e9SAndroid Build Coastguard Worker    ----------------------------------------------------------------
56*da0073e9SAndroid Build Coastguard Worker */
57*da0073e9SAndroid Build Coastguard Worker 
58*da0073e9SAndroid Build Coastguard Worker 
59*da0073e9SAndroid Build Coastguard Worker /* This file is for inclusion into client (your!) code.
60*da0073e9SAndroid Build Coastguard Worker 
61*da0073e9SAndroid Build Coastguard Worker    You can use these macros to manipulate and query Valgrind's
62*da0073e9SAndroid Build Coastguard Worker    execution inside your own programs.
63*da0073e9SAndroid Build Coastguard Worker 
64*da0073e9SAndroid Build Coastguard Worker    The resulting executables will still run without Valgrind, just a
65*da0073e9SAndroid Build Coastguard Worker    little bit more slowly than they otherwise would, but otherwise
66*da0073e9SAndroid Build Coastguard Worker    unchanged.  When not running on valgrind, each client request
67*da0073e9SAndroid Build Coastguard Worker    consumes very few (eg. 7) instructions, so the resulting performance
68*da0073e9SAndroid Build Coastguard Worker    loss is negligible unless you plan to execute client requests
69*da0073e9SAndroid Build Coastguard Worker    millions of times per second.  Nevertheless, if that is still a
70*da0073e9SAndroid Build Coastguard Worker    problem, you can compile with the NVALGRIND symbol defined (gcc
71*da0073e9SAndroid Build Coastguard Worker    -DNVALGRIND) so that client requests are not even compiled in.  */
72*da0073e9SAndroid Build Coastguard Worker 
73*da0073e9SAndroid Build Coastguard Worker #ifndef __VALGRIND_H
74*da0073e9SAndroid Build Coastguard Worker #define __VALGRIND_H
75*da0073e9SAndroid Build Coastguard Worker 
76*da0073e9SAndroid Build Coastguard Worker 
77*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
78*da0073e9SAndroid Build Coastguard Worker /* VERSION NUMBER OF VALGRIND                                         */
79*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
80*da0073e9SAndroid Build Coastguard Worker 
81*da0073e9SAndroid Build Coastguard Worker /* Specify Valgrind's version number, so that user code can
82*da0073e9SAndroid Build Coastguard Worker    conditionally compile based on our version number.  Note that these
83*da0073e9SAndroid Build Coastguard Worker    were introduced at version 3.6 and so do not exist in version 3.5
84*da0073e9SAndroid Build Coastguard Worker    or earlier.  The recommended way to use them to check for "version
85*da0073e9SAndroid Build Coastguard Worker    X.Y or later" is (eg)
86*da0073e9SAndroid Build Coastguard Worker 
87*da0073e9SAndroid Build Coastguard Worker #if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__)   \
88*da0073e9SAndroid Build Coastguard Worker     && (__VALGRIND_MAJOR__ > 3                                   \
89*da0073e9SAndroid Build Coastguard Worker         || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6))
90*da0073e9SAndroid Build Coastguard Worker */
91*da0073e9SAndroid Build Coastguard Worker #define __VALGRIND_MAJOR__    3
92*da0073e9SAndroid Build Coastguard Worker #define __VALGRIND_MINOR__    17
93*da0073e9SAndroid Build Coastguard Worker 
94*da0073e9SAndroid Build Coastguard Worker 
95*da0073e9SAndroid Build Coastguard Worker #include <stdarg.h>
96*da0073e9SAndroid Build Coastguard Worker 
97*da0073e9SAndroid Build Coastguard Worker /* Nb: this file might be included in a file compiled with -ansi.  So
98*da0073e9SAndroid Build Coastguard Worker    we can't use C++ style "//" comments nor the "asm" keyword (instead
99*da0073e9SAndroid Build Coastguard Worker    use "__asm__"). */
100*da0073e9SAndroid Build Coastguard Worker 
101*da0073e9SAndroid Build Coastguard Worker /* Derive some tags indicating what the target platform is.  Note
102*da0073e9SAndroid Build Coastguard Worker    that in this file we're using the compiler's CPP symbols for
103*da0073e9SAndroid Build Coastguard Worker    identifying architectures, which are different to the ones we use
104*da0073e9SAndroid Build Coastguard Worker    within the rest of Valgrind.  Note, __powerpc__ is active for both
105*da0073e9SAndroid Build Coastguard Worker    32 and 64-bit PPC, whereas __powerpc64__ is only active for the
106*da0073e9SAndroid Build Coastguard Worker    latter (on Linux, that is).
107*da0073e9SAndroid Build Coastguard Worker 
108*da0073e9SAndroid Build Coastguard Worker    Misc note: how to find out what's predefined in gcc by default:
109*da0073e9SAndroid Build Coastguard Worker    gcc -Wp,-dM somefile.c
110*da0073e9SAndroid Build Coastguard Worker */
111*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_darwin
112*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_darwin
113*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_win32
114*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_win64
115*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_linux
116*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_linux
117*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc32_linux
118*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc64be_linux
119*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc64le_linux
120*da0073e9SAndroid Build Coastguard Worker #undef PLAT_arm_linux
121*da0073e9SAndroid Build Coastguard Worker #undef PLAT_arm64_linux
122*da0073e9SAndroid Build Coastguard Worker #undef PLAT_s390x_linux
123*da0073e9SAndroid Build Coastguard Worker #undef PLAT_mips32_linux
124*da0073e9SAndroid Build Coastguard Worker #undef PLAT_mips64_linux
125*da0073e9SAndroid Build Coastguard Worker #undef PLAT_nanomips_linux
126*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_solaris
127*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_solaris
128*da0073e9SAndroid Build Coastguard Worker 
129*da0073e9SAndroid Build Coastguard Worker 
130*da0073e9SAndroid Build Coastguard Worker #if defined(__APPLE__) && defined(__i386__)
131*da0073e9SAndroid Build Coastguard Worker #  define PLAT_x86_darwin 1
132*da0073e9SAndroid Build Coastguard Worker #elif defined(__APPLE__) && defined(__x86_64__)
133*da0073e9SAndroid Build Coastguard Worker #  define PLAT_amd64_darwin 1
134*da0073e9SAndroid Build Coastguard Worker #elif (defined(__MINGW32__) && defined(__i386__)) \
135*da0073e9SAndroid Build Coastguard Worker       || defined(__CYGWIN32__) \
136*da0073e9SAndroid Build Coastguard Worker       || (defined(_WIN32) && defined(_M_IX86))
137*da0073e9SAndroid Build Coastguard Worker #  define PLAT_x86_win32 1
138*da0073e9SAndroid Build Coastguard Worker #elif (defined(__MINGW32__) && defined(__x86_64__)) \
139*da0073e9SAndroid Build Coastguard Worker       || (defined(_WIN32) && defined(_M_X64))
140*da0073e9SAndroid Build Coastguard Worker /* __MINGW32__ and _WIN32 are defined in 64 bit mode as well. */
141*da0073e9SAndroid Build Coastguard Worker #  define PLAT_amd64_win64 1
142*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__i386__)
143*da0073e9SAndroid Build Coastguard Worker #  define PLAT_x86_linux 1
144*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__x86_64__) && !defined(__ILP32__)
145*da0073e9SAndroid Build Coastguard Worker #  define PLAT_amd64_linux 1
146*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
147*da0073e9SAndroid Build Coastguard Worker #  define PLAT_ppc32_linux 1
148*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF != 2
149*da0073e9SAndroid Build Coastguard Worker /* Big Endian uses ELF version 1 */
150*da0073e9SAndroid Build Coastguard Worker #  define PLAT_ppc64be_linux 1
151*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF == 2
152*da0073e9SAndroid Build Coastguard Worker /* Little Endian uses ELF version 2 */
153*da0073e9SAndroid Build Coastguard Worker #  define PLAT_ppc64le_linux 1
154*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__arm__) && !defined(__aarch64__)
155*da0073e9SAndroid Build Coastguard Worker #  define PLAT_arm_linux 1
156*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__aarch64__) && !defined(__arm__)
157*da0073e9SAndroid Build Coastguard Worker #  define PLAT_arm64_linux 1
158*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__s390__) && defined(__s390x__)
159*da0073e9SAndroid Build Coastguard Worker #  define PLAT_s390x_linux 1
160*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__mips__) && (__mips==64)
161*da0073e9SAndroid Build Coastguard Worker #  define PLAT_mips64_linux 1
162*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__mips__) && (__mips==32)
163*da0073e9SAndroid Build Coastguard Worker #  define PLAT_mips32_linux 1
164*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__nanomips__)
165*da0073e9SAndroid Build Coastguard Worker #  define PLAT_nanomips_linux 1
166*da0073e9SAndroid Build Coastguard Worker #elif defined(__sun) && defined(__i386__)
167*da0073e9SAndroid Build Coastguard Worker #  define PLAT_x86_solaris 1
168*da0073e9SAndroid Build Coastguard Worker #elif defined(__sun) && defined(__x86_64__)
169*da0073e9SAndroid Build Coastguard Worker #  define PLAT_amd64_solaris 1
170*da0073e9SAndroid Build Coastguard Worker #else
171*da0073e9SAndroid Build Coastguard Worker /* If we're not compiling for our target platform, don't generate
172*da0073e9SAndroid Build Coastguard Worker    any inline asms.  */
173*da0073e9SAndroid Build Coastguard Worker #  if !defined(NVALGRIND)
174*da0073e9SAndroid Build Coastguard Worker #    define NVALGRIND 1
175*da0073e9SAndroid Build Coastguard Worker #  endif
176*da0073e9SAndroid Build Coastguard Worker #endif
177*da0073e9SAndroid Build Coastguard Worker 
178*da0073e9SAndroid Build Coastguard Worker 
179*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
180*da0073e9SAndroid Build Coastguard Worker /* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS.  There is nothing */
181*da0073e9SAndroid Build Coastguard Worker /* in here of use to end-users -- skip to the next section.           */
182*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
183*da0073e9SAndroid Build Coastguard Worker 
184*da0073e9SAndroid Build Coastguard Worker /*
185*da0073e9SAndroid Build Coastguard Worker  * VALGRIND_DO_CLIENT_REQUEST(): a statement that invokes a Valgrind client
186*da0073e9SAndroid Build Coastguard Worker  * request. Accepts both pointers and integers as arguments.
187*da0073e9SAndroid Build Coastguard Worker  *
188*da0073e9SAndroid Build Coastguard Worker  * VALGRIND_DO_CLIENT_REQUEST_STMT(): a statement that invokes a Valgrind
189*da0073e9SAndroid Build Coastguard Worker  * client request that does not return a value.
190*da0073e9SAndroid Build Coastguard Worker 
191*da0073e9SAndroid Build Coastguard Worker  * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind
192*da0073e9SAndroid Build Coastguard Worker  * client request and whose value equals the client request result.  Accepts
193*da0073e9SAndroid Build Coastguard Worker  * both pointers and integers as arguments.  Note that such calls are not
194*da0073e9SAndroid Build Coastguard Worker  * necessarily pure functions -- they may have side effects.
195*da0073e9SAndroid Build Coastguard Worker  */
196*da0073e9SAndroid Build Coastguard Worker 
197*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default,            \
198*da0073e9SAndroid Build Coastguard Worker                                    _zzq_request, _zzq_arg1, _zzq_arg2,  \
199*da0073e9SAndroid Build Coastguard Worker                                    _zzq_arg3, _zzq_arg4, _zzq_arg5)     \
200*da0073e9SAndroid Build Coastguard Worker   do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default),   \
201*da0073e9SAndroid Build Coastguard Worker                         (_zzq_request), (_zzq_arg1), (_zzq_arg2),       \
202*da0073e9SAndroid Build Coastguard Worker                         (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
203*da0073e9SAndroid Build Coastguard Worker 
204*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1,        \
205*da0073e9SAndroid Build Coastguard Worker                            _zzq_arg2,  _zzq_arg3, _zzq_arg4, _zzq_arg5) \
206*da0073e9SAndroid Build Coastguard Worker   do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                        \
207*da0073e9SAndroid Build Coastguard Worker                     (_zzq_request), (_zzq_arg1), (_zzq_arg2),           \
208*da0073e9SAndroid Build Coastguard Worker                     (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
209*da0073e9SAndroid Build Coastguard Worker 
210*da0073e9SAndroid Build Coastguard Worker #if defined(NVALGRIND)
211*da0073e9SAndroid Build Coastguard Worker 
212*da0073e9SAndroid Build Coastguard Worker /* Define NVALGRIND to completely remove the Valgrind magic sequence
213*da0073e9SAndroid Build Coastguard Worker    from the compiled code (analogous to NDEBUG's effects on
214*da0073e9SAndroid Build Coastguard Worker    assert()) */
215*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
216*da0073e9SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                               \
217*da0073e9SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
218*da0073e9SAndroid Build Coastguard Worker       (_zzq_default)
219*da0073e9SAndroid Build Coastguard Worker 
220*da0073e9SAndroid Build Coastguard Worker #else  /* ! NVALGRIND */
221*da0073e9SAndroid Build Coastguard Worker 
222*da0073e9SAndroid Build Coastguard Worker /* The following defines the magic code sequences which the JITter
223*da0073e9SAndroid Build Coastguard Worker    spots and handles magically.  Don't look too closely at them as
224*da0073e9SAndroid Build Coastguard Worker    they will rot your brain.
225*da0073e9SAndroid Build Coastguard Worker 
226*da0073e9SAndroid Build Coastguard Worker    The assembly code sequences for all architectures is in this one
227*da0073e9SAndroid Build Coastguard Worker    file.  This is because this file must be stand-alone, and we don't
228*da0073e9SAndroid Build Coastguard Worker    want to have multiple files.
229*da0073e9SAndroid Build Coastguard Worker 
230*da0073e9SAndroid Build Coastguard Worker    For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default
231*da0073e9SAndroid Build Coastguard Worker    value gets put in the return slot, so that everything works when
232*da0073e9SAndroid Build Coastguard Worker    this is executed not under Valgrind.  Args are passed in a memory
233*da0073e9SAndroid Build Coastguard Worker    block, and so there's no intrinsic limit to the number that could
234*da0073e9SAndroid Build Coastguard Worker    be passed, but it's currently five.
235*da0073e9SAndroid Build Coastguard Worker 
236*da0073e9SAndroid Build Coastguard Worker    The macro args are:
237*da0073e9SAndroid Build Coastguard Worker       _zzq_rlval    result lvalue
238*da0073e9SAndroid Build Coastguard Worker       _zzq_default  default value (result returned when running on real CPU)
239*da0073e9SAndroid Build Coastguard Worker       _zzq_request  request code
240*da0073e9SAndroid Build Coastguard Worker       _zzq_arg1..5  request params
241*da0073e9SAndroid Build Coastguard Worker 
242*da0073e9SAndroid Build Coastguard Worker    The other two macros are used to support function wrapping, and are
243*da0073e9SAndroid Build Coastguard Worker    a lot simpler.  VALGRIND_GET_NR_CONTEXT returns the value of the
244*da0073e9SAndroid Build Coastguard Worker    guest's NRADDR pseudo-register and whatever other information is
245*da0073e9SAndroid Build Coastguard Worker    needed to safely run the call original from the wrapper: on
246*da0073e9SAndroid Build Coastguard Worker    ppc64-linux, the R2 value at the divert point is also needed.  This
247*da0073e9SAndroid Build Coastguard Worker    information is abstracted into a user-visible type, OrigFn.
248*da0073e9SAndroid Build Coastguard Worker 
249*da0073e9SAndroid Build Coastguard Worker    VALGRIND_CALL_NOREDIR_* behaves the same as the following on the
250*da0073e9SAndroid Build Coastguard Worker    guest, but guarantees that the branch instruction will not be
251*da0073e9SAndroid Build Coastguard Worker    redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64:
252*da0073e9SAndroid Build Coastguard Worker    branch-and-link-to-r11.  VALGRIND_CALL_NOREDIR is just text, not a
253*da0073e9SAndroid Build Coastguard Worker    complete inline asm, since it needs to be combined with more magic
254*da0073e9SAndroid Build Coastguard Worker    inline asm stuff to be useful.
255*da0073e9SAndroid Build Coastguard Worker */
256*da0073e9SAndroid Build Coastguard Worker 
257*da0073e9SAndroid Build Coastguard Worker /* ----------------- x86-{linux,darwin,solaris} ---------------- */
258*da0073e9SAndroid Build Coastguard Worker 
259*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)  \
260*da0073e9SAndroid Build Coastguard Worker     ||  (defined(PLAT_x86_win32) && defined(__GNUC__)) \
261*da0073e9SAndroid Build Coastguard Worker     ||  defined(PLAT_x86_solaris)
262*da0073e9SAndroid Build Coastguard Worker 
263*da0073e9SAndroid Build Coastguard Worker typedef
264*da0073e9SAndroid Build Coastguard Worker    struct {
265*da0073e9SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
266*da0073e9SAndroid Build Coastguard Worker    }
267*da0073e9SAndroid Build Coastguard Worker    OrigFn;
268*da0073e9SAndroid Build Coastguard Worker 
269*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
270*da0073e9SAndroid Build Coastguard Worker                      "roll $3,  %%edi ; roll $13, %%edi\n\t"      \
271*da0073e9SAndroid Build Coastguard Worker                      "roll $29, %%edi ; roll $19, %%edi\n\t"
272*da0073e9SAndroid Build Coastguard Worker 
273*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
274*da0073e9SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                               \
275*da0073e9SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
276*da0073e9SAndroid Build Coastguard Worker   __extension__                                                   \
277*da0073e9SAndroid Build Coastguard Worker   ({volatile unsigned int _zzq_args[6];                           \
278*da0073e9SAndroid Build Coastguard Worker     volatile unsigned int _zzq_result;                            \
279*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
280*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
281*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
282*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
283*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
284*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
285*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
286*da0073e9SAndroid Build Coastguard Worker                      /* %EDX = client_request ( %EAX ) */         \
287*da0073e9SAndroid Build Coastguard Worker                      "xchgl %%ebx,%%ebx"                          \
288*da0073e9SAndroid Build Coastguard Worker                      : "=d" (_zzq_result)                         \
289*da0073e9SAndroid Build Coastguard Worker                      : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
290*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
291*da0073e9SAndroid Build Coastguard Worker                     );                                            \
292*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                  \
293*da0073e9SAndroid Build Coastguard Worker   })
294*da0073e9SAndroid Build Coastguard Worker 
295*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
296*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
297*da0073e9SAndroid Build Coastguard Worker     volatile unsigned int __addr;                                 \
298*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
299*da0073e9SAndroid Build Coastguard Worker                      /* %EAX = guest_NRADDR */                    \
300*da0073e9SAndroid Build Coastguard Worker                      "xchgl %%ecx,%%ecx"                          \
301*da0073e9SAndroid Build Coastguard Worker                      : "=a" (__addr)                              \
302*da0073e9SAndroid Build Coastguard Worker                      :                                            \
303*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
304*da0073e9SAndroid Build Coastguard Worker                     );                                            \
305*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
306*da0073e9SAndroid Build Coastguard Worker   }
307*da0073e9SAndroid Build Coastguard Worker 
308*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_EAX                                 \
309*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
310*da0073e9SAndroid Build Coastguard Worker                      /* call-noredir *%EAX */                     \
311*da0073e9SAndroid Build Coastguard Worker                      "xchgl %%edx,%%edx\n\t"
312*da0073e9SAndroid Build Coastguard Worker 
313*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
314*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
315*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
316*da0073e9SAndroid Build Coastguard Worker                      "xchgl %%edi,%%edi\n\t"                     \
317*da0073e9SAndroid Build Coastguard Worker                      : : : "cc", "memory"                        \
318*da0073e9SAndroid Build Coastguard Worker                     );                                           \
319*da0073e9SAndroid Build Coastguard Worker  } while (0)
320*da0073e9SAndroid Build Coastguard Worker 
321*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__)
322*da0073e9SAndroid Build Coastguard Worker           || PLAT_x86_solaris */
323*da0073e9SAndroid Build Coastguard Worker 
324*da0073e9SAndroid Build Coastguard Worker /* ------------------------- x86-Win32 ------------------------- */
325*da0073e9SAndroid Build Coastguard Worker 
326*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_x86_win32) && !defined(__GNUC__)
327*da0073e9SAndroid Build Coastguard Worker 
328*da0073e9SAndroid Build Coastguard Worker typedef
329*da0073e9SAndroid Build Coastguard Worker    struct {
330*da0073e9SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
331*da0073e9SAndroid Build Coastguard Worker    }
332*da0073e9SAndroid Build Coastguard Worker    OrigFn;
333*da0073e9SAndroid Build Coastguard Worker 
334*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER)
335*da0073e9SAndroid Build Coastguard Worker 
336*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
337*da0073e9SAndroid Build Coastguard Worker                      __asm rol edi, 3  __asm rol edi, 13          \
338*da0073e9SAndroid Build Coastguard Worker                      __asm rol edi, 29 __asm rol edi, 19
339*da0073e9SAndroid Build Coastguard Worker 
340*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
341*da0073e9SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                               \
342*da0073e9SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
343*da0073e9SAndroid Build Coastguard Worker     valgrind_do_client_request_expr((uintptr_t)(_zzq_default),    \
344*da0073e9SAndroid Build Coastguard Worker         (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1),        \
345*da0073e9SAndroid Build Coastguard Worker         (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3),           \
346*da0073e9SAndroid Build Coastguard Worker         (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5))
347*da0073e9SAndroid Build Coastguard Worker 
348*da0073e9SAndroid Build Coastguard Worker static __inline uintptr_t
valgrind_do_client_request_expr(uintptr_t _zzq_default,uintptr_t _zzq_request,uintptr_t _zzq_arg1,uintptr_t _zzq_arg2,uintptr_t _zzq_arg3,uintptr_t _zzq_arg4,uintptr_t _zzq_arg5)349*da0073e9SAndroid Build Coastguard Worker valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request,
350*da0073e9SAndroid Build Coastguard Worker                                 uintptr_t _zzq_arg1, uintptr_t _zzq_arg2,
351*da0073e9SAndroid Build Coastguard Worker                                 uintptr_t _zzq_arg3, uintptr_t _zzq_arg4,
352*da0073e9SAndroid Build Coastguard Worker                                 uintptr_t _zzq_arg5)
353*da0073e9SAndroid Build Coastguard Worker {
354*da0073e9SAndroid Build Coastguard Worker     volatile uintptr_t _zzq_args[6];
355*da0073e9SAndroid Build Coastguard Worker     volatile unsigned int _zzq_result;
356*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (uintptr_t)(_zzq_request);
357*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (uintptr_t)(_zzq_arg1);
358*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (uintptr_t)(_zzq_arg2);
359*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (uintptr_t)(_zzq_arg3);
360*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (uintptr_t)(_zzq_arg4);
361*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (uintptr_t)(_zzq_arg5);
362*da0073e9SAndroid Build Coastguard Worker     __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default
363*da0073e9SAndroid Build Coastguard Worker             __SPECIAL_INSTRUCTION_PREAMBLE
364*da0073e9SAndroid Build Coastguard Worker             /* %EDX = client_request ( %EAX ) */
365*da0073e9SAndroid Build Coastguard Worker             __asm xchg ebx,ebx
366*da0073e9SAndroid Build Coastguard Worker             __asm mov _zzq_result, edx
367*da0073e9SAndroid Build Coastguard Worker     }
368*da0073e9SAndroid Build Coastguard Worker     return _zzq_result;
369*da0073e9SAndroid Build Coastguard Worker }
370*da0073e9SAndroid Build Coastguard Worker 
371*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
372*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
373*da0073e9SAndroid Build Coastguard Worker     volatile unsigned int __addr;                                 \
374*da0073e9SAndroid Build Coastguard Worker     __asm { __SPECIAL_INSTRUCTION_PREAMBLE                        \
375*da0073e9SAndroid Build Coastguard Worker             /* %EAX = guest_NRADDR */                             \
376*da0073e9SAndroid Build Coastguard Worker             __asm xchg ecx,ecx                                    \
377*da0073e9SAndroid Build Coastguard Worker             __asm mov __addr, eax                                 \
378*da0073e9SAndroid Build Coastguard Worker     }                                                             \
379*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
380*da0073e9SAndroid Build Coastguard Worker   }
381*da0073e9SAndroid Build Coastguard Worker 
382*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_EAX ERROR
383*da0073e9SAndroid Build Coastguard Worker 
384*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
385*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
386*da0073e9SAndroid Build Coastguard Worker     __asm { __SPECIAL_INSTRUCTION_PREAMBLE                       \
387*da0073e9SAndroid Build Coastguard Worker             __asm xchg edi,edi                                   \
388*da0073e9SAndroid Build Coastguard Worker     }                                                            \
389*da0073e9SAndroid Build Coastguard Worker  } while (0)
390*da0073e9SAndroid Build Coastguard Worker 
391*da0073e9SAndroid Build Coastguard Worker #else
392*da0073e9SAndroid Build Coastguard Worker #error Unsupported compiler.
393*da0073e9SAndroid Build Coastguard Worker #endif
394*da0073e9SAndroid Build Coastguard Worker 
395*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_x86_win32 */
396*da0073e9SAndroid Build Coastguard Worker 
397*da0073e9SAndroid Build Coastguard Worker /* ----------------- amd64-{linux,darwin,solaris} --------------- */
398*da0073e9SAndroid Build Coastguard Worker 
399*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin) \
400*da0073e9SAndroid Build Coastguard Worker     ||  defined(PLAT_amd64_solaris) \
401*da0073e9SAndroid Build Coastguard Worker     ||  (defined(PLAT_amd64_win64) && defined(__GNUC__))
402*da0073e9SAndroid Build Coastguard Worker 
403*da0073e9SAndroid Build Coastguard Worker typedef
404*da0073e9SAndroid Build Coastguard Worker    struct {
405*da0073e9SAndroid Build Coastguard Worker       unsigned long int nraddr; /* where's the code? */
406*da0073e9SAndroid Build Coastguard Worker    }
407*da0073e9SAndroid Build Coastguard Worker    OrigFn;
408*da0073e9SAndroid Build Coastguard Worker 
409*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
410*da0073e9SAndroid Build Coastguard Worker                      "rolq $3,  %%rdi ; rolq $13, %%rdi\n\t"      \
411*da0073e9SAndroid Build Coastguard Worker                      "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
412*da0073e9SAndroid Build Coastguard Worker 
413*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
414*da0073e9SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                               \
415*da0073e9SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
416*da0073e9SAndroid Build Coastguard Worker     __extension__                                                 \
417*da0073e9SAndroid Build Coastguard Worker     ({ volatile unsigned long int _zzq_args[6];                   \
418*da0073e9SAndroid Build Coastguard Worker     volatile unsigned long int _zzq_result;                       \
419*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned long int)(_zzq_request);             \
420*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
421*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
422*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
423*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
424*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
425*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
426*da0073e9SAndroid Build Coastguard Worker                      /* %RDX = client_request ( %RAX ) */         \
427*da0073e9SAndroid Build Coastguard Worker                      "xchgq %%rbx,%%rbx"                          \
428*da0073e9SAndroid Build Coastguard Worker                      : "=d" (_zzq_result)                         \
429*da0073e9SAndroid Build Coastguard Worker                      : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
430*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
431*da0073e9SAndroid Build Coastguard Worker                     );                                            \
432*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                  \
433*da0073e9SAndroid Build Coastguard Worker     })
434*da0073e9SAndroid Build Coastguard Worker 
435*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
436*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
437*da0073e9SAndroid Build Coastguard Worker     volatile unsigned long int __addr;                            \
438*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
439*da0073e9SAndroid Build Coastguard Worker                      /* %RAX = guest_NRADDR */                    \
440*da0073e9SAndroid Build Coastguard Worker                      "xchgq %%rcx,%%rcx"                          \
441*da0073e9SAndroid Build Coastguard Worker                      : "=a" (__addr)                              \
442*da0073e9SAndroid Build Coastguard Worker                      :                                            \
443*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
444*da0073e9SAndroid Build Coastguard Worker                     );                                            \
445*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
446*da0073e9SAndroid Build Coastguard Worker   }
447*da0073e9SAndroid Build Coastguard Worker 
448*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_RAX                                 \
449*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
450*da0073e9SAndroid Build Coastguard Worker                      /* call-noredir *%RAX */                     \
451*da0073e9SAndroid Build Coastguard Worker                      "xchgq %%rdx,%%rdx\n\t"
452*da0073e9SAndroid Build Coastguard Worker 
453*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
454*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
455*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
456*da0073e9SAndroid Build Coastguard Worker                      "xchgq %%rdi,%%rdi\n\t"                     \
457*da0073e9SAndroid Build Coastguard Worker                      : : : "cc", "memory"                        \
458*da0073e9SAndroid Build Coastguard Worker                     );                                           \
459*da0073e9SAndroid Build Coastguard Worker  } while (0)
460*da0073e9SAndroid Build Coastguard Worker 
461*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_amd64_linux || PLAT_amd64_darwin || PLAT_amd64_solaris */
462*da0073e9SAndroid Build Coastguard Worker 
463*da0073e9SAndroid Build Coastguard Worker /* ------------------------- amd64-Win64 ------------------------- */
464*da0073e9SAndroid Build Coastguard Worker 
465*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_amd64_win64) && !defined(__GNUC__)
466*da0073e9SAndroid Build Coastguard Worker 
467*da0073e9SAndroid Build Coastguard Worker #error Unsupported compiler.
468*da0073e9SAndroid Build Coastguard Worker 
469*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_amd64_win64 */
470*da0073e9SAndroid Build Coastguard Worker 
471*da0073e9SAndroid Build Coastguard Worker /* ------------------------ ppc32-linux ------------------------ */
472*da0073e9SAndroid Build Coastguard Worker 
473*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc32_linux)
474*da0073e9SAndroid Build Coastguard Worker 
475*da0073e9SAndroid Build Coastguard Worker typedef
476*da0073e9SAndroid Build Coastguard Worker    struct {
477*da0073e9SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
478*da0073e9SAndroid Build Coastguard Worker    }
479*da0073e9SAndroid Build Coastguard Worker    OrigFn;
480*da0073e9SAndroid Build Coastguard Worker 
481*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
482*da0073e9SAndroid Build Coastguard Worker                     "rlwinm 0,0,3,0,31  ; rlwinm 0,0,13,0,31\n\t" \
483*da0073e9SAndroid Build Coastguard Worker                     "rlwinm 0,0,29,0,31 ; rlwinm 0,0,19,0,31\n\t"
484*da0073e9SAndroid Build Coastguard Worker 
485*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
486*da0073e9SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                               \
487*da0073e9SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
488*da0073e9SAndroid Build Coastguard Worker                                                                   \
489*da0073e9SAndroid Build Coastguard Worker     __extension__                                                 \
490*da0073e9SAndroid Build Coastguard Worker   ({         unsigned int  _zzq_args[6];                          \
491*da0073e9SAndroid Build Coastguard Worker              unsigned int  _zzq_result;                           \
492*da0073e9SAndroid Build Coastguard Worker              unsigned int* _zzq_ptr;                              \
493*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
494*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
495*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
496*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
497*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
498*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
499*da0073e9SAndroid Build Coastguard Worker     _zzq_ptr = _zzq_args;                                         \
500*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
501*da0073e9SAndroid Build Coastguard Worker                      "mr 4,%2\n\t" /*ptr*/                        \
502*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
503*da0073e9SAndroid Build Coastguard Worker                      /* %R3 = client_request ( %R4 ) */           \
504*da0073e9SAndroid Build Coastguard Worker                      "or 1,1,1\n\t"                               \
505*da0073e9SAndroid Build Coastguard Worker                      "mr %0,3"     /*result*/                     \
506*da0073e9SAndroid Build Coastguard Worker                      : "=b" (_zzq_result)                         \
507*da0073e9SAndroid Build Coastguard Worker                      : "b" (_zzq_default), "b" (_zzq_ptr)         \
508*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "r3", "r4");               \
509*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                  \
510*da0073e9SAndroid Build Coastguard Worker     })
511*da0073e9SAndroid Build Coastguard Worker 
512*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
513*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
514*da0073e9SAndroid Build Coastguard Worker     unsigned int __addr;                                          \
515*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
516*da0073e9SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR */                     \
517*da0073e9SAndroid Build Coastguard Worker                      "or 2,2,2\n\t"                               \
518*da0073e9SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
519*da0073e9SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
520*da0073e9SAndroid Build Coastguard Worker                      :                                            \
521*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "r3"                       \
522*da0073e9SAndroid Build Coastguard Worker                     );                                            \
523*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
524*da0073e9SAndroid Build Coastguard Worker   }
525*da0073e9SAndroid Build Coastguard Worker 
526*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
527*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
528*da0073e9SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir *%R11 */       \
529*da0073e9SAndroid Build Coastguard Worker                      "or 3,3,3\n\t"
530*da0073e9SAndroid Build Coastguard Worker 
531*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
532*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
533*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
534*da0073e9SAndroid Build Coastguard Worker                      "or 5,5,5\n\t"                              \
535*da0073e9SAndroid Build Coastguard Worker                     );                                           \
536*da0073e9SAndroid Build Coastguard Worker  } while (0)
537*da0073e9SAndroid Build Coastguard Worker 
538*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc32_linux */
539*da0073e9SAndroid Build Coastguard Worker 
540*da0073e9SAndroid Build Coastguard Worker /* ------------------------ ppc64-linux ------------------------ */
541*da0073e9SAndroid Build Coastguard Worker 
542*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc64be_linux)
543*da0073e9SAndroid Build Coastguard Worker 
544*da0073e9SAndroid Build Coastguard Worker typedef
545*da0073e9SAndroid Build Coastguard Worker    struct {
546*da0073e9SAndroid Build Coastguard Worker       unsigned long int nraddr; /* where's the code? */
547*da0073e9SAndroid Build Coastguard Worker       unsigned long int r2;  /* what tocptr do we need? */
548*da0073e9SAndroid Build Coastguard Worker    }
549*da0073e9SAndroid Build Coastguard Worker    OrigFn;
550*da0073e9SAndroid Build Coastguard Worker 
551*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
552*da0073e9SAndroid Build Coastguard Worker                      "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
553*da0073e9SAndroid Build Coastguard Worker                      "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
554*da0073e9SAndroid Build Coastguard Worker 
555*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
556*da0073e9SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                               \
557*da0073e9SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
558*da0073e9SAndroid Build Coastguard Worker                                                                   \
559*da0073e9SAndroid Build Coastguard Worker   __extension__                                                   \
560*da0073e9SAndroid Build Coastguard Worker   ({         unsigned long int  _zzq_args[6];                     \
561*da0073e9SAndroid Build Coastguard Worker              unsigned long int  _zzq_result;                      \
562*da0073e9SAndroid Build Coastguard Worker              unsigned long int* _zzq_ptr;                         \
563*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned long int)(_zzq_request);             \
564*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
565*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
566*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
567*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
568*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
569*da0073e9SAndroid Build Coastguard Worker     _zzq_ptr = _zzq_args;                                         \
570*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
571*da0073e9SAndroid Build Coastguard Worker                      "mr 4,%2\n\t" /*ptr*/                        \
572*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
573*da0073e9SAndroid Build Coastguard Worker                      /* %R3 = client_request ( %R4 ) */           \
574*da0073e9SAndroid Build Coastguard Worker                      "or 1,1,1\n\t"                               \
575*da0073e9SAndroid Build Coastguard Worker                      "mr %0,3"     /*result*/                     \
576*da0073e9SAndroid Build Coastguard Worker                      : "=b" (_zzq_result)                         \
577*da0073e9SAndroid Build Coastguard Worker                      : "b" (_zzq_default), "b" (_zzq_ptr)         \
578*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "r3", "r4");               \
579*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                  \
580*da0073e9SAndroid Build Coastguard Worker   })
581*da0073e9SAndroid Build Coastguard Worker 
582*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
583*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
584*da0073e9SAndroid Build Coastguard Worker     unsigned long int __addr;                                     \
585*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
586*da0073e9SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR */                     \
587*da0073e9SAndroid Build Coastguard Worker                      "or 2,2,2\n\t"                               \
588*da0073e9SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
589*da0073e9SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
590*da0073e9SAndroid Build Coastguard Worker                      :                                            \
591*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "r3"                       \
592*da0073e9SAndroid Build Coastguard Worker                     );                                            \
593*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
594*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
595*da0073e9SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR_GPR2 */                \
596*da0073e9SAndroid Build Coastguard Worker                      "or 4,4,4\n\t"                               \
597*da0073e9SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
598*da0073e9SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
599*da0073e9SAndroid Build Coastguard Worker                      :                                            \
600*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "r3"                       \
601*da0073e9SAndroid Build Coastguard Worker                     );                                            \
602*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->r2 = __addr;                                       \
603*da0073e9SAndroid Build Coastguard Worker   }
604*da0073e9SAndroid Build Coastguard Worker 
605*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
606*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
607*da0073e9SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir *%R11 */       \
608*da0073e9SAndroid Build Coastguard Worker                      "or 3,3,3\n\t"
609*da0073e9SAndroid Build Coastguard Worker 
610*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
611*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
612*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
613*da0073e9SAndroid Build Coastguard Worker                      "or 5,5,5\n\t"                              \
614*da0073e9SAndroid Build Coastguard Worker                     );                                           \
615*da0073e9SAndroid Build Coastguard Worker  } while (0)
616*da0073e9SAndroid Build Coastguard Worker 
617*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc64be_linux */
618*da0073e9SAndroid Build Coastguard Worker 
619*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc64le_linux)
620*da0073e9SAndroid Build Coastguard Worker 
621*da0073e9SAndroid Build Coastguard Worker typedef
622*da0073e9SAndroid Build Coastguard Worker    struct {
623*da0073e9SAndroid Build Coastguard Worker       unsigned long int nraddr; /* where's the code? */
624*da0073e9SAndroid Build Coastguard Worker       unsigned long int r2;     /* what tocptr do we need? */
625*da0073e9SAndroid Build Coastguard Worker    }
626*da0073e9SAndroid Build Coastguard Worker    OrigFn;
627*da0073e9SAndroid Build Coastguard Worker 
628*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
629*da0073e9SAndroid Build Coastguard Worker                      "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
630*da0073e9SAndroid Build Coastguard Worker                      "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
631*da0073e9SAndroid Build Coastguard Worker 
632*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
633*da0073e9SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                               \
634*da0073e9SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
635*da0073e9SAndroid Build Coastguard Worker                                                                   \
636*da0073e9SAndroid Build Coastguard Worker   __extension__                                                   \
637*da0073e9SAndroid Build Coastguard Worker   ({         unsigned long int  _zzq_args[6];                     \
638*da0073e9SAndroid Build Coastguard Worker              unsigned long int  _zzq_result;                      \
639*da0073e9SAndroid Build Coastguard Worker              unsigned long int* _zzq_ptr;                         \
640*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned long int)(_zzq_request);             \
641*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
642*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
643*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
644*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
645*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
646*da0073e9SAndroid Build Coastguard Worker     _zzq_ptr = _zzq_args;                                         \
647*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
648*da0073e9SAndroid Build Coastguard Worker                      "mr 4,%2\n\t" /*ptr*/                        \
649*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
650*da0073e9SAndroid Build Coastguard Worker                      /* %R3 = client_request ( %R4 ) */           \
651*da0073e9SAndroid Build Coastguard Worker                      "or 1,1,1\n\t"                               \
652*da0073e9SAndroid Build Coastguard Worker                      "mr %0,3"     /*result*/                     \
653*da0073e9SAndroid Build Coastguard Worker                      : "=b" (_zzq_result)                         \
654*da0073e9SAndroid Build Coastguard Worker                      : "b" (_zzq_default), "b" (_zzq_ptr)         \
655*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "r3", "r4");               \
656*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                  \
657*da0073e9SAndroid Build Coastguard Worker   })
658*da0073e9SAndroid Build Coastguard Worker 
659*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
660*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
661*da0073e9SAndroid Build Coastguard Worker     unsigned long int __addr;                                     \
662*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
663*da0073e9SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR */                     \
664*da0073e9SAndroid Build Coastguard Worker                      "or 2,2,2\n\t"                               \
665*da0073e9SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
666*da0073e9SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
667*da0073e9SAndroid Build Coastguard Worker                      :                                            \
668*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "r3"                       \
669*da0073e9SAndroid Build Coastguard Worker                     );                                            \
670*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
671*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
672*da0073e9SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR_GPR2 */                \
673*da0073e9SAndroid Build Coastguard Worker                      "or 4,4,4\n\t"                               \
674*da0073e9SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
675*da0073e9SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
676*da0073e9SAndroid Build Coastguard Worker                      :                                            \
677*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "r3"                       \
678*da0073e9SAndroid Build Coastguard Worker                     );                                            \
679*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->r2 = __addr;                                       \
680*da0073e9SAndroid Build Coastguard Worker   }
681*da0073e9SAndroid Build Coastguard Worker 
682*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                   \
683*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
684*da0073e9SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir *%R12 */       \
685*da0073e9SAndroid Build Coastguard Worker                      "or 3,3,3\n\t"
686*da0073e9SAndroid Build Coastguard Worker 
687*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
688*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
689*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
690*da0073e9SAndroid Build Coastguard Worker                      "or 5,5,5\n\t"                              \
691*da0073e9SAndroid Build Coastguard Worker                     );                                           \
692*da0073e9SAndroid Build Coastguard Worker  } while (0)
693*da0073e9SAndroid Build Coastguard Worker 
694*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc64le_linux */
695*da0073e9SAndroid Build Coastguard Worker 
696*da0073e9SAndroid Build Coastguard Worker /* ------------------------- arm-linux ------------------------- */
697*da0073e9SAndroid Build Coastguard Worker 
698*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_arm_linux)
699*da0073e9SAndroid Build Coastguard Worker 
700*da0073e9SAndroid Build Coastguard Worker typedef
701*da0073e9SAndroid Build Coastguard Worker    struct {
702*da0073e9SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
703*da0073e9SAndroid Build Coastguard Worker    }
704*da0073e9SAndroid Build Coastguard Worker    OrigFn;
705*da0073e9SAndroid Build Coastguard Worker 
706*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
707*da0073e9SAndroid Build Coastguard Worker             "mov r12, r12, ror #3  ; mov r12, r12, ror #13 \n\t"  \
708*da0073e9SAndroid Build Coastguard Worker             "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
709*da0073e9SAndroid Build Coastguard Worker 
710*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
711*da0073e9SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                               \
712*da0073e9SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
713*da0073e9SAndroid Build Coastguard Worker                                                                   \
714*da0073e9SAndroid Build Coastguard Worker   __extension__                                                   \
715*da0073e9SAndroid Build Coastguard Worker   ({volatile unsigned int  _zzq_args[6];                          \
716*da0073e9SAndroid Build Coastguard Worker     volatile unsigned int  _zzq_result;                           \
717*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
718*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
719*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
720*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
721*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
722*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
723*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile("mov r3, %1\n\t" /*default*/                 \
724*da0073e9SAndroid Build Coastguard Worker                      "mov r4, %2\n\t" /*ptr*/                     \
725*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
726*da0073e9SAndroid Build Coastguard Worker                      /* R3 = client_request ( R4 ) */             \
727*da0073e9SAndroid Build Coastguard Worker                      "orr r10, r10, r10\n\t"                      \
728*da0073e9SAndroid Build Coastguard Worker                      "mov %0, r3"     /*result*/                  \
729*da0073e9SAndroid Build Coastguard Worker                      : "=r" (_zzq_result)                         \
730*da0073e9SAndroid Build Coastguard Worker                      : "r" (_zzq_default), "r" (&_zzq_args[0])    \
731*da0073e9SAndroid Build Coastguard Worker                      : "cc","memory", "r3", "r4");                \
732*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                  \
733*da0073e9SAndroid Build Coastguard Worker   })
734*da0073e9SAndroid Build Coastguard Worker 
735*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
736*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
737*da0073e9SAndroid Build Coastguard Worker     unsigned int __addr;                                          \
738*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
739*da0073e9SAndroid Build Coastguard Worker                      /* R3 = guest_NRADDR */                      \
740*da0073e9SAndroid Build Coastguard Worker                      "orr r11, r11, r11\n\t"                      \
741*da0073e9SAndroid Build Coastguard Worker                      "mov %0, r3"                                 \
742*da0073e9SAndroid Build Coastguard Worker                      : "=r" (__addr)                              \
743*da0073e9SAndroid Build Coastguard Worker                      :                                            \
744*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "r3"                       \
745*da0073e9SAndroid Build Coastguard Worker                     );                                            \
746*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
747*da0073e9SAndroid Build Coastguard Worker   }
748*da0073e9SAndroid Build Coastguard Worker 
749*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                    \
750*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
751*da0073e9SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir *%R4 */        \
752*da0073e9SAndroid Build Coastguard Worker                      "orr r12, r12, r12\n\t"
753*da0073e9SAndroid Build Coastguard Worker 
754*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
755*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
756*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
757*da0073e9SAndroid Build Coastguard Worker                      "orr r9, r9, r9\n\t"                        \
758*da0073e9SAndroid Build Coastguard Worker                      : : : "cc", "memory"                        \
759*da0073e9SAndroid Build Coastguard Worker                     );                                           \
760*da0073e9SAndroid Build Coastguard Worker  } while (0)
761*da0073e9SAndroid Build Coastguard Worker 
762*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_arm_linux */
763*da0073e9SAndroid Build Coastguard Worker 
764*da0073e9SAndroid Build Coastguard Worker /* ------------------------ arm64-linux ------------------------- */
765*da0073e9SAndroid Build Coastguard Worker 
766*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_arm64_linux)
767*da0073e9SAndroid Build Coastguard Worker 
768*da0073e9SAndroid Build Coastguard Worker typedef
769*da0073e9SAndroid Build Coastguard Worker    struct {
770*da0073e9SAndroid Build Coastguard Worker       unsigned long int nraddr; /* where's the code? */
771*da0073e9SAndroid Build Coastguard Worker    }
772*da0073e9SAndroid Build Coastguard Worker    OrigFn;
773*da0073e9SAndroid Build Coastguard Worker 
774*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
775*da0073e9SAndroid Build Coastguard Worker             "ror x12, x12, #3  ;  ror x12, x12, #13 \n\t"         \
776*da0073e9SAndroid Build Coastguard Worker             "ror x12, x12, #51 ;  ror x12, x12, #61 \n\t"
777*da0073e9SAndroid Build Coastguard Worker 
778*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
779*da0073e9SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                               \
780*da0073e9SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
781*da0073e9SAndroid Build Coastguard Worker                                                                   \
782*da0073e9SAndroid Build Coastguard Worker   __extension__                                                   \
783*da0073e9SAndroid Build Coastguard Worker   ({volatile unsigned long int  _zzq_args[6];                     \
784*da0073e9SAndroid Build Coastguard Worker     volatile unsigned long int  _zzq_result;                      \
785*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned long int)(_zzq_request);             \
786*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
787*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
788*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
789*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
790*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
791*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile("mov x3, %1\n\t" /*default*/                 \
792*da0073e9SAndroid Build Coastguard Worker                      "mov x4, %2\n\t" /*ptr*/                     \
793*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
794*da0073e9SAndroid Build Coastguard Worker                      /* X3 = client_request ( X4 ) */             \
795*da0073e9SAndroid Build Coastguard Worker                      "orr x10, x10, x10\n\t"                      \
796*da0073e9SAndroid Build Coastguard Worker                      "mov %0, x3"     /*result*/                  \
797*da0073e9SAndroid Build Coastguard Worker                      : "=r" (_zzq_result)                         \
798*da0073e9SAndroid Build Coastguard Worker                      : "r" ((unsigned long int)(_zzq_default)),   \
799*da0073e9SAndroid Build Coastguard Worker                        "r" (&_zzq_args[0])                        \
800*da0073e9SAndroid Build Coastguard Worker                      : "cc","memory", "x3", "x4");                \
801*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                  \
802*da0073e9SAndroid Build Coastguard Worker   })
803*da0073e9SAndroid Build Coastguard Worker 
804*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
805*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
806*da0073e9SAndroid Build Coastguard Worker     unsigned long int __addr;                                     \
807*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
808*da0073e9SAndroid Build Coastguard Worker                      /* X3 = guest_NRADDR */                      \
809*da0073e9SAndroid Build Coastguard Worker                      "orr x11, x11, x11\n\t"                      \
810*da0073e9SAndroid Build Coastguard Worker                      "mov %0, x3"                                 \
811*da0073e9SAndroid Build Coastguard Worker                      : "=r" (__addr)                              \
812*da0073e9SAndroid Build Coastguard Worker                      :                                            \
813*da0073e9SAndroid Build Coastguard Worker                      : "cc", "memory", "x3"                       \
814*da0073e9SAndroid Build Coastguard Worker                     );                                            \
815*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
816*da0073e9SAndroid Build Coastguard Worker   }
817*da0073e9SAndroid Build Coastguard Worker 
818*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                    \
819*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
820*da0073e9SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir X8 */          \
821*da0073e9SAndroid Build Coastguard Worker                      "orr x12, x12, x12\n\t"
822*da0073e9SAndroid Build Coastguard Worker 
823*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
824*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
825*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
826*da0073e9SAndroid Build Coastguard Worker                      "orr x9, x9, x9\n\t"                        \
827*da0073e9SAndroid Build Coastguard Worker                      : : : "cc", "memory"                        \
828*da0073e9SAndroid Build Coastguard Worker                     );                                           \
829*da0073e9SAndroid Build Coastguard Worker  } while (0)
830*da0073e9SAndroid Build Coastguard Worker 
831*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_arm64_linux */
832*da0073e9SAndroid Build Coastguard Worker 
833*da0073e9SAndroid Build Coastguard Worker /* ------------------------ s390x-linux ------------------------ */
834*da0073e9SAndroid Build Coastguard Worker 
835*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_s390x_linux)
836*da0073e9SAndroid Build Coastguard Worker 
837*da0073e9SAndroid Build Coastguard Worker typedef
838*da0073e9SAndroid Build Coastguard Worker   struct {
839*da0073e9SAndroid Build Coastguard Worker      unsigned long int nraddr; /* where's the code? */
840*da0073e9SAndroid Build Coastguard Worker   }
841*da0073e9SAndroid Build Coastguard Worker   OrigFn;
842*da0073e9SAndroid Build Coastguard Worker 
843*da0073e9SAndroid Build Coastguard Worker /* __SPECIAL_INSTRUCTION_PREAMBLE will be used to identify Valgrind specific
844*da0073e9SAndroid Build Coastguard Worker  * code. This detection is implemented in platform specific toIR.c
845*da0073e9SAndroid Build Coastguard Worker  * (e.g. VEX/priv/guest_s390_decoder.c).
846*da0073e9SAndroid Build Coastguard Worker  */
847*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                           \
848*da0073e9SAndroid Build Coastguard Worker                      "lr 15,15\n\t"                              \
849*da0073e9SAndroid Build Coastguard Worker                      "lr 1,1\n\t"                                \
850*da0073e9SAndroid Build Coastguard Worker                      "lr 2,2\n\t"                                \
851*da0073e9SAndroid Build Coastguard Worker                      "lr 3,3\n\t"
852*da0073e9SAndroid Build Coastguard Worker 
853*da0073e9SAndroid Build Coastguard Worker #define __CLIENT_REQUEST_CODE "lr 2,2\n\t"
854*da0073e9SAndroid Build Coastguard Worker #define __GET_NR_CONTEXT_CODE "lr 3,3\n\t"
855*da0073e9SAndroid Build Coastguard Worker #define __CALL_NO_REDIR_CODE  "lr 4,4\n\t"
856*da0073e9SAndroid Build Coastguard Worker #define __VEX_INJECT_IR_CODE  "lr 5,5\n\t"
857*da0073e9SAndroid Build Coastguard Worker 
858*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                         \
859*da0073e9SAndroid Build Coastguard Worker        _zzq_default, _zzq_request,                               \
860*da0073e9SAndroid Build Coastguard Worker        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
861*da0073e9SAndroid Build Coastguard Worker   __extension__                                                  \
862*da0073e9SAndroid Build Coastguard Worker  ({volatile unsigned long int _zzq_args[6];                      \
863*da0073e9SAndroid Build Coastguard Worker    volatile unsigned long int _zzq_result;                       \
864*da0073e9SAndroid Build Coastguard Worker    _zzq_args[0] = (unsigned long int)(_zzq_request);             \
865*da0073e9SAndroid Build Coastguard Worker    _zzq_args[1] = (unsigned long int)(_zzq_arg1);                \
866*da0073e9SAndroid Build Coastguard Worker    _zzq_args[2] = (unsigned long int)(_zzq_arg2);                \
867*da0073e9SAndroid Build Coastguard Worker    _zzq_args[3] = (unsigned long int)(_zzq_arg3);                \
868*da0073e9SAndroid Build Coastguard Worker    _zzq_args[4] = (unsigned long int)(_zzq_arg4);                \
869*da0073e9SAndroid Build Coastguard Worker    _zzq_args[5] = (unsigned long int)(_zzq_arg5);                \
870*da0073e9SAndroid Build Coastguard Worker    __asm__ volatile(/* r2 = args */                              \
871*da0073e9SAndroid Build Coastguard Worker                     "lgr 2,%1\n\t"                               \
872*da0073e9SAndroid Build Coastguard Worker                     /* r3 = default */                           \
873*da0073e9SAndroid Build Coastguard Worker                     "lgr 3,%2\n\t"                               \
874*da0073e9SAndroid Build Coastguard Worker                     __SPECIAL_INSTRUCTION_PREAMBLE               \
875*da0073e9SAndroid Build Coastguard Worker                     __CLIENT_REQUEST_CODE                        \
876*da0073e9SAndroid Build Coastguard Worker                     /* results = r3 */                           \
877*da0073e9SAndroid Build Coastguard Worker                     "lgr %0, 3\n\t"                              \
878*da0073e9SAndroid Build Coastguard Worker                     : "=d" (_zzq_result)                         \
879*da0073e9SAndroid Build Coastguard Worker                     : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
880*da0073e9SAndroid Build Coastguard Worker                     : "cc", "2", "3", "memory"                   \
881*da0073e9SAndroid Build Coastguard Worker                    );                                            \
882*da0073e9SAndroid Build Coastguard Worker    _zzq_result;                                                  \
883*da0073e9SAndroid Build Coastguard Worker  })
884*da0073e9SAndroid Build Coastguard Worker 
885*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                      \
886*da0073e9SAndroid Build Coastguard Worker  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
887*da0073e9SAndroid Build Coastguard Worker    volatile unsigned long int __addr;                            \
888*da0073e9SAndroid Build Coastguard Worker    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
889*da0073e9SAndroid Build Coastguard Worker                     __GET_NR_CONTEXT_CODE                        \
890*da0073e9SAndroid Build Coastguard Worker                     "lgr %0, 3\n\t"                              \
891*da0073e9SAndroid Build Coastguard Worker                     : "=a" (__addr)                              \
892*da0073e9SAndroid Build Coastguard Worker                     :                                            \
893*da0073e9SAndroid Build Coastguard Worker                     : "cc", "3", "memory"                        \
894*da0073e9SAndroid Build Coastguard Worker                    );                                            \
895*da0073e9SAndroid Build Coastguard Worker    _zzq_orig->nraddr = __addr;                                   \
896*da0073e9SAndroid Build Coastguard Worker  }
897*da0073e9SAndroid Build Coastguard Worker 
898*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_R1                                 \
899*da0073e9SAndroid Build Coastguard Worker                     __SPECIAL_INSTRUCTION_PREAMBLE               \
900*da0073e9SAndroid Build Coastguard Worker                     __CALL_NO_REDIR_CODE
901*da0073e9SAndroid Build Coastguard Worker 
902*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
903*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
904*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
905*da0073e9SAndroid Build Coastguard Worker                      __VEX_INJECT_IR_CODE);                      \
906*da0073e9SAndroid Build Coastguard Worker  } while (0)
907*da0073e9SAndroid Build Coastguard Worker 
908*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_s390x_linux */
909*da0073e9SAndroid Build Coastguard Worker 
910*da0073e9SAndroid Build Coastguard Worker /* ------------------------- mips32-linux ---------------- */
911*da0073e9SAndroid Build Coastguard Worker 
912*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_mips32_linux)
913*da0073e9SAndroid Build Coastguard Worker 
914*da0073e9SAndroid Build Coastguard Worker typedef
915*da0073e9SAndroid Build Coastguard Worker    struct {
916*da0073e9SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
917*da0073e9SAndroid Build Coastguard Worker    }
918*da0073e9SAndroid Build Coastguard Worker    OrigFn;
919*da0073e9SAndroid Build Coastguard Worker 
920*da0073e9SAndroid Build Coastguard Worker /* .word  0x342
921*da0073e9SAndroid Build Coastguard Worker  * .word  0x742
922*da0073e9SAndroid Build Coastguard Worker  * .word  0xC2
923*da0073e9SAndroid Build Coastguard Worker  * .word  0x4C2*/
924*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE          \
925*da0073e9SAndroid Build Coastguard Worker                      "srl $0, $0, 13\n\t"       \
926*da0073e9SAndroid Build Coastguard Worker                      "srl $0, $0, 29\n\t"       \
927*da0073e9SAndroid Build Coastguard Worker                      "srl $0, $0, 3\n\t"        \
928*da0073e9SAndroid Build Coastguard Worker                      "srl $0, $0, 19\n\t"
929*da0073e9SAndroid Build Coastguard Worker 
930*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
931*da0073e9SAndroid Build Coastguard Worker        _zzq_default, _zzq_request,                                \
932*da0073e9SAndroid Build Coastguard Worker        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)     \
933*da0073e9SAndroid Build Coastguard Worker   __extension__                                                   \
934*da0073e9SAndroid Build Coastguard Worker   ({ volatile unsigned int _zzq_args[6];                          \
935*da0073e9SAndroid Build Coastguard Worker     volatile unsigned int _zzq_result;                            \
936*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
937*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
938*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
939*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
940*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
941*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
942*da0073e9SAndroid Build Coastguard Worker         __asm__ volatile("move $11, %1\n\t" /*default*/           \
943*da0073e9SAndroid Build Coastguard Worker                      "move $12, %2\n\t" /*ptr*/                   \
944*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
945*da0073e9SAndroid Build Coastguard Worker                      /* T3 = client_request ( T4 ) */             \
946*da0073e9SAndroid Build Coastguard Worker                      "or $13, $13, $13\n\t"                       \
947*da0073e9SAndroid Build Coastguard Worker                      "move %0, $11\n\t"     /*result*/            \
948*da0073e9SAndroid Build Coastguard Worker                      : "=r" (_zzq_result)                         \
949*da0073e9SAndroid Build Coastguard Worker                      : "r" (_zzq_default), "r" (&_zzq_args[0])    \
950*da0073e9SAndroid Build Coastguard Worker                      : "$11", "$12", "memory");                   \
951*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                  \
952*da0073e9SAndroid Build Coastguard Worker   })
953*da0073e9SAndroid Build Coastguard Worker 
954*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
955*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
956*da0073e9SAndroid Build Coastguard Worker     volatile unsigned int __addr;                                 \
957*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
958*da0073e9SAndroid Build Coastguard Worker                      /* %t9 = guest_NRADDR */                     \
959*da0073e9SAndroid Build Coastguard Worker                      "or $14, $14, $14\n\t"                       \
960*da0073e9SAndroid Build Coastguard Worker                      "move %0, $11"     /*result*/                \
961*da0073e9SAndroid Build Coastguard Worker                      : "=r" (__addr)                              \
962*da0073e9SAndroid Build Coastguard Worker                      :                                            \
963*da0073e9SAndroid Build Coastguard Worker                      : "$11"                                      \
964*da0073e9SAndroid Build Coastguard Worker                     );                                            \
965*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
966*da0073e9SAndroid Build Coastguard Worker   }
967*da0073e9SAndroid Build Coastguard Worker 
968*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_T9                                 \
969*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE              \
970*da0073e9SAndroid Build Coastguard Worker                      /* call-noredir *%t9 */                     \
971*da0073e9SAndroid Build Coastguard Worker                      "or $15, $15, $15\n\t"
972*da0073e9SAndroid Build Coastguard Worker 
973*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                 \
974*da0073e9SAndroid Build Coastguard Worker  do {                                                            \
975*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE              \
976*da0073e9SAndroid Build Coastguard Worker                      "or $11, $11, $11\n\t"                      \
977*da0073e9SAndroid Build Coastguard Worker                     );                                           \
978*da0073e9SAndroid Build Coastguard Worker  } while (0)
979*da0073e9SAndroid Build Coastguard Worker 
980*da0073e9SAndroid Build Coastguard Worker 
981*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_mips32_linux */
982*da0073e9SAndroid Build Coastguard Worker 
983*da0073e9SAndroid Build Coastguard Worker /* ------------------------- mips64-linux ---------------- */
984*da0073e9SAndroid Build Coastguard Worker 
985*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_mips64_linux)
986*da0073e9SAndroid Build Coastguard Worker 
987*da0073e9SAndroid Build Coastguard Worker typedef
988*da0073e9SAndroid Build Coastguard Worker    struct {
989*da0073e9SAndroid Build Coastguard Worker       unsigned long nraddr; /* where's the code? */
990*da0073e9SAndroid Build Coastguard Worker    }
991*da0073e9SAndroid Build Coastguard Worker    OrigFn;
992*da0073e9SAndroid Build Coastguard Worker 
993*da0073e9SAndroid Build Coastguard Worker /* dsll $0,$0, 3
994*da0073e9SAndroid Build Coastguard Worker  * dsll $0,$0, 13
995*da0073e9SAndroid Build Coastguard Worker  * dsll $0,$0, 29
996*da0073e9SAndroid Build Coastguard Worker  * dsll $0,$0, 19*/
997*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                              \
998*da0073e9SAndroid Build Coastguard Worker                      "dsll $0,$0, 3 ; dsll $0,$0,13\n\t"            \
999*da0073e9SAndroid Build Coastguard Worker                      "dsll $0,$0,29 ; dsll $0,$0,19\n\t"
1000*da0073e9SAndroid Build Coastguard Worker 
1001*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                            \
1002*da0073e9SAndroid Build Coastguard Worker        _zzq_default, _zzq_request,                                  \
1003*da0073e9SAndroid Build Coastguard Worker        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)       \
1004*da0073e9SAndroid Build Coastguard Worker   __extension__                                                     \
1005*da0073e9SAndroid Build Coastguard Worker   ({ volatile unsigned long int _zzq_args[6];                       \
1006*da0073e9SAndroid Build Coastguard Worker     volatile unsigned long int _zzq_result;                         \
1007*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned long int)(_zzq_request);               \
1008*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned long int)(_zzq_arg1);                  \
1009*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned long int)(_zzq_arg2);                  \
1010*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned long int)(_zzq_arg3);                  \
1011*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned long int)(_zzq_arg4);                  \
1012*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned long int)(_zzq_arg5);                  \
1013*da0073e9SAndroid Build Coastguard Worker         __asm__ volatile("move $11, %1\n\t" /*default*/             \
1014*da0073e9SAndroid Build Coastguard Worker                          "move $12, %2\n\t" /*ptr*/                 \
1015*da0073e9SAndroid Build Coastguard Worker                          __SPECIAL_INSTRUCTION_PREAMBLE             \
1016*da0073e9SAndroid Build Coastguard Worker                          /* $11 = client_request ( $12 ) */         \
1017*da0073e9SAndroid Build Coastguard Worker                          "or $13, $13, $13\n\t"                     \
1018*da0073e9SAndroid Build Coastguard Worker                          "move %0, $11\n\t"     /*result*/          \
1019*da0073e9SAndroid Build Coastguard Worker                          : "=r" (_zzq_result)                       \
1020*da0073e9SAndroid Build Coastguard Worker                          : "r" (_zzq_default), "r" (&_zzq_args[0])  \
1021*da0073e9SAndroid Build Coastguard Worker                          : "$11", "$12", "memory");                 \
1022*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                    \
1023*da0073e9SAndroid Build Coastguard Worker   })
1024*da0073e9SAndroid Build Coastguard Worker 
1025*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                         \
1026*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                     \
1027*da0073e9SAndroid Build Coastguard Worker     volatile unsigned long int __addr;                              \
1028*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
1029*da0073e9SAndroid Build Coastguard Worker                      /* $11 = guest_NRADDR */                       \
1030*da0073e9SAndroid Build Coastguard Worker                      "or $14, $14, $14\n\t"                         \
1031*da0073e9SAndroid Build Coastguard Worker                      "move %0, $11"     /*result*/                  \
1032*da0073e9SAndroid Build Coastguard Worker                      : "=r" (__addr)                                \
1033*da0073e9SAndroid Build Coastguard Worker                      :                                              \
1034*da0073e9SAndroid Build Coastguard Worker                      : "$11");                                      \
1035*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                     \
1036*da0073e9SAndroid Build Coastguard Worker   }
1037*da0073e9SAndroid Build Coastguard Worker 
1038*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_T9                                    \
1039*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE                 \
1040*da0073e9SAndroid Build Coastguard Worker                      /* call-noredir $25 */                         \
1041*da0073e9SAndroid Build Coastguard Worker                      "or $15, $15, $15\n\t"
1042*da0073e9SAndroid Build Coastguard Worker 
1043*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                    \
1044*da0073e9SAndroid Build Coastguard Worker  do {                                                               \
1045*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
1046*da0073e9SAndroid Build Coastguard Worker                      "or $11, $11, $11\n\t"                         \
1047*da0073e9SAndroid Build Coastguard Worker                     );                                              \
1048*da0073e9SAndroid Build Coastguard Worker  } while (0)
1049*da0073e9SAndroid Build Coastguard Worker 
1050*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_mips64_linux */
1051*da0073e9SAndroid Build Coastguard Worker 
1052*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_nanomips_linux)
1053*da0073e9SAndroid Build Coastguard Worker 
1054*da0073e9SAndroid Build Coastguard Worker typedef
1055*da0073e9SAndroid Build Coastguard Worker    struct {
1056*da0073e9SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
1057*da0073e9SAndroid Build Coastguard Worker    }
1058*da0073e9SAndroid Build Coastguard Worker    OrigFn;
1059*da0073e9SAndroid Build Coastguard Worker /*
1060*da0073e9SAndroid Build Coastguard Worker    8000 c04d  srl  zero, zero, 13
1061*da0073e9SAndroid Build Coastguard Worker    8000 c05d  srl  zero, zero, 29
1062*da0073e9SAndroid Build Coastguard Worker    8000 c043  srl  zero, zero,  3
1063*da0073e9SAndroid Build Coastguard Worker    8000 c053  srl  zero, zero, 19
1064*da0073e9SAndroid Build Coastguard Worker */
1065*da0073e9SAndroid Build Coastguard Worker 
1066*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE "srl[32] $zero, $zero, 13 \n\t" \
1067*da0073e9SAndroid Build Coastguard Worker                                        "srl[32] $zero, $zero, 29 \n\t" \
1068*da0073e9SAndroid Build Coastguard Worker                                        "srl[32] $zero, $zero, 3  \n\t" \
1069*da0073e9SAndroid Build Coastguard Worker                                        "srl[32] $zero, $zero, 19 \n\t"
1070*da0073e9SAndroid Build Coastguard Worker 
1071*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                          \
1072*da0073e9SAndroid Build Coastguard Worker        _zzq_default, _zzq_request,                                \
1073*da0073e9SAndroid Build Coastguard Worker        _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)     \
1074*da0073e9SAndroid Build Coastguard Worker   __extension__                                                   \
1075*da0073e9SAndroid Build Coastguard Worker   ({ volatile unsigned int _zzq_args[6];                          \
1076*da0073e9SAndroid Build Coastguard Worker     volatile unsigned int _zzq_result;                            \
1077*da0073e9SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
1078*da0073e9SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
1079*da0073e9SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
1080*da0073e9SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
1081*da0073e9SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
1082*da0073e9SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
1083*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile("move $a7, %1\n\t" /* default */             \
1084*da0073e9SAndroid Build Coastguard Worker                      "move $t0, %2\n\t" /* ptr */                 \
1085*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
1086*da0073e9SAndroid Build Coastguard Worker                      /* $a7 = client_request( $t0 ) */            \
1087*da0073e9SAndroid Build Coastguard Worker                      "or[32] $t0, $t0, $t0\n\t"                   \
1088*da0073e9SAndroid Build Coastguard Worker                      "move %0, $a7\n\t"     /* result */          \
1089*da0073e9SAndroid Build Coastguard Worker                      : "=r" (_zzq_result)                         \
1090*da0073e9SAndroid Build Coastguard Worker                      : "r" (_zzq_default), "r" (&_zzq_args[0])    \
1091*da0073e9SAndroid Build Coastguard Worker                      : "$a7", "$t0", "memory");                   \
1092*da0073e9SAndroid Build Coastguard Worker     _zzq_result;                                                  \
1093*da0073e9SAndroid Build Coastguard Worker   })
1094*da0073e9SAndroid Build Coastguard Worker 
1095*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                         \
1096*da0073e9SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                     \
1097*da0073e9SAndroid Build Coastguard Worker     volatile unsigned long int __addr;                              \
1098*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
1099*da0073e9SAndroid Build Coastguard Worker                      /* $a7 = guest_NRADDR */                       \
1100*da0073e9SAndroid Build Coastguard Worker                      "or[32] $t1, $t1, $t1\n\t"                     \
1101*da0073e9SAndroid Build Coastguard Worker                      "move %0, $a7"     /*result*/                  \
1102*da0073e9SAndroid Build Coastguard Worker                      : "=r" (__addr)                                \
1103*da0073e9SAndroid Build Coastguard Worker                      :                                              \
1104*da0073e9SAndroid Build Coastguard Worker                      : "$a7");                                      \
1105*da0073e9SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                     \
1106*da0073e9SAndroid Build Coastguard Worker   }
1107*da0073e9SAndroid Build Coastguard Worker 
1108*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_T9                                    \
1109*da0073e9SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE                 \
1110*da0073e9SAndroid Build Coastguard Worker                      /* call-noredir $25 */                         \
1111*da0073e9SAndroid Build Coastguard Worker                      "or[32] $t2, $t2, $t2\n\t"
1112*da0073e9SAndroid Build Coastguard Worker 
1113*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR()                                    \
1114*da0073e9SAndroid Build Coastguard Worker  do {                                                               \
1115*da0073e9SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE                 \
1116*da0073e9SAndroid Build Coastguard Worker                      "or[32] $t3, $t3, $t3\n\t"                     \
1117*da0073e9SAndroid Build Coastguard Worker                     );                                              \
1118*da0073e9SAndroid Build Coastguard Worker  } while (0)
1119*da0073e9SAndroid Build Coastguard Worker 
1120*da0073e9SAndroid Build Coastguard Worker #endif
1121*da0073e9SAndroid Build Coastguard Worker /* Insert assembly code for other platforms here... */
1122*da0073e9SAndroid Build Coastguard Worker 
1123*da0073e9SAndroid Build Coastguard Worker #endif /* NVALGRIND */
1124*da0073e9SAndroid Build Coastguard Worker 
1125*da0073e9SAndroid Build Coastguard Worker 
1126*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
1127*da0073e9SAndroid Build Coastguard Worker /* PLATFORM SPECIFICS for FUNCTION WRAPPING.  This is all very        */
1128*da0073e9SAndroid Build Coastguard Worker /* ugly.  It's the least-worst tradeoff I can think of.               */
1129*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
1130*da0073e9SAndroid Build Coastguard Worker 
1131*da0073e9SAndroid Build Coastguard Worker /* This section defines magic (a.k.a appalling-hack) macros for doing
1132*da0073e9SAndroid Build Coastguard Worker    guaranteed-no-redirection macros, so as to get from function
1133*da0073e9SAndroid Build Coastguard Worker    wrappers to the functions they are wrapping.  The whole point is to
1134*da0073e9SAndroid Build Coastguard Worker    construct standard call sequences, but to do the call itself with a
1135*da0073e9SAndroid Build Coastguard Worker    special no-redirect call pseudo-instruction that the JIT
1136*da0073e9SAndroid Build Coastguard Worker    understands and handles specially.  This section is long and
1137*da0073e9SAndroid Build Coastguard Worker    repetitious, and I can't see a way to make it shorter.
1138*da0073e9SAndroid Build Coastguard Worker 
1139*da0073e9SAndroid Build Coastguard Worker    The naming scheme is as follows:
1140*da0073e9SAndroid Build Coastguard Worker 
1141*da0073e9SAndroid Build Coastguard Worker       CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc}
1142*da0073e9SAndroid Build Coastguard Worker 
1143*da0073e9SAndroid Build Coastguard Worker    'W' stands for "word" and 'v' for "void".  Hence there are
1144*da0073e9SAndroid Build Coastguard Worker    different macros for calling arity 0, 1, 2, 3, 4, etc, functions,
1145*da0073e9SAndroid Build Coastguard Worker    and for each, the possibility of returning a word-typed result, or
1146*da0073e9SAndroid Build Coastguard Worker    no result.
1147*da0073e9SAndroid Build Coastguard Worker */
1148*da0073e9SAndroid Build Coastguard Worker 
1149*da0073e9SAndroid Build Coastguard Worker /* Use these to write the name of your wrapper.  NOTE: duplicates
1150*da0073e9SAndroid Build Coastguard Worker    VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h.  NOTE also: inserts
1151*da0073e9SAndroid Build Coastguard Worker    the default behaviour equivalance class tag "0000" into the name.
1152*da0073e9SAndroid Build Coastguard Worker    See pub_tool_redir.h for details -- normally you don't need to
1153*da0073e9SAndroid Build Coastguard Worker    think about this, though. */
1154*da0073e9SAndroid Build Coastguard Worker 
1155*da0073e9SAndroid Build Coastguard Worker /* Use an extra level of macroisation so as to ensure the soname/fnname
1156*da0073e9SAndroid Build Coastguard Worker    args are fully macro-expanded before pasting them together. */
1157*da0073e9SAndroid Build Coastguard Worker #define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
1158*da0073e9SAndroid Build Coastguard Worker 
1159*da0073e9SAndroid Build Coastguard Worker #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname)                    \
1160*da0073e9SAndroid Build Coastguard Worker    VG_CONCAT4(_vgw00000ZU_,soname,_,fnname)
1161*da0073e9SAndroid Build Coastguard Worker 
1162*da0073e9SAndroid Build Coastguard Worker #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname)                    \
1163*da0073e9SAndroid Build Coastguard Worker    VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname)
1164*da0073e9SAndroid Build Coastguard Worker 
1165*da0073e9SAndroid Build Coastguard Worker /* Use this macro from within a wrapper function to collect the
1166*da0073e9SAndroid Build Coastguard Worker    context (address and possibly other info) of the original function.
1167*da0073e9SAndroid Build Coastguard Worker    Once you have that you can then use it in one of the CALL_FN_
1168*da0073e9SAndroid Build Coastguard Worker    macros.  The type of the argument _lval is OrigFn. */
1169*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_ORIG_FN(_lval)  VALGRIND_GET_NR_CONTEXT(_lval)
1170*da0073e9SAndroid Build Coastguard Worker 
1171*da0073e9SAndroid Build Coastguard Worker /* Also provide end-user facilities for function replacement, rather
1172*da0073e9SAndroid Build Coastguard Worker    than wrapping.  A replacement function differs from a wrapper in
1173*da0073e9SAndroid Build Coastguard Worker    that it has no way to get hold of the original function being
1174*da0073e9SAndroid Build Coastguard Worker    called, and hence no way to call onwards to it.  In a replacement
1175*da0073e9SAndroid Build Coastguard Worker    function, VALGRIND_GET_ORIG_FN always returns zero. */
1176*da0073e9SAndroid Build Coastguard Worker 
1177*da0073e9SAndroid Build Coastguard Worker #define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname)                 \
1178*da0073e9SAndroid Build Coastguard Worker    VG_CONCAT4(_vgr00000ZU_,soname,_,fnname)
1179*da0073e9SAndroid Build Coastguard Worker 
1180*da0073e9SAndroid Build Coastguard Worker #define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname)                 \
1181*da0073e9SAndroid Build Coastguard Worker    VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname)
1182*da0073e9SAndroid Build Coastguard Worker 
1183*da0073e9SAndroid Build Coastguard Worker /* Derivatives of the main macros below, for calling functions
1184*da0073e9SAndroid Build Coastguard Worker    returning void. */
1185*da0073e9SAndroid Build Coastguard Worker 
1186*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_v(fnptr)                                        \
1187*da0073e9SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
1188*da0073e9SAndroid Build Coastguard Worker         CALL_FN_W_v(_junk,fnptr); } while (0)
1189*da0073e9SAndroid Build Coastguard Worker 
1190*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_W(fnptr, arg1)                                  \
1191*da0073e9SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
1192*da0073e9SAndroid Build Coastguard Worker         CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
1193*da0073e9SAndroid Build Coastguard Worker 
1194*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_WW(fnptr, arg1,arg2)                            \
1195*da0073e9SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
1196*da0073e9SAndroid Build Coastguard Worker         CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
1197*da0073e9SAndroid Build Coastguard Worker 
1198*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3)                      \
1199*da0073e9SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
1200*da0073e9SAndroid Build Coastguard Worker         CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
1201*da0073e9SAndroid Build Coastguard Worker 
1202*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4)                \
1203*da0073e9SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
1204*da0073e9SAndroid Build Coastguard Worker         CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
1205*da0073e9SAndroid Build Coastguard Worker 
1206*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5)             \
1207*da0073e9SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
1208*da0073e9SAndroid Build Coastguard Worker         CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
1209*da0073e9SAndroid Build Coastguard Worker 
1210*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6)        \
1211*da0073e9SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
1212*da0073e9SAndroid Build Coastguard Worker         CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
1213*da0073e9SAndroid Build Coastguard Worker 
1214*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7)   \
1215*da0073e9SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
1216*da0073e9SAndroid Build Coastguard Worker         CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
1217*da0073e9SAndroid Build Coastguard Worker 
1218*da0073e9SAndroid Build Coastguard Worker /* ----------------- x86-{linux,darwin,solaris} ---------------- */
1219*da0073e9SAndroid Build Coastguard Worker 
1220*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin) \
1221*da0073e9SAndroid Build Coastguard Worker     ||  defined(PLAT_x86_solaris)
1222*da0073e9SAndroid Build Coastguard Worker 
1223*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call.  No need to mention eax
1224*da0073e9SAndroid Build Coastguard Worker    as gcc can already see that, plus causes gcc to bomb. */
1225*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx"
1226*da0073e9SAndroid Build Coastguard Worker 
1227*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
1228*da0073e9SAndroid Build Coastguard Worker    call and restore it afterwards as gcc may not keep the stack
1229*da0073e9SAndroid Build Coastguard Worker    pointer aligned if it doesn't realise calls are being made
1230*da0073e9SAndroid Build Coastguard Worker    to other functions. */
1231*da0073e9SAndroid Build Coastguard Worker 
1232*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK               \
1233*da0073e9SAndroid Build Coastguard Worker       "movl %%esp,%%edi\n\t"               \
1234*da0073e9SAndroid Build Coastguard Worker       "andl $0xfffffff0,%%esp\n\t"
1235*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK             \
1236*da0073e9SAndroid Build Coastguard Worker       "movl %%edi,%%esp\n\t"
1237*da0073e9SAndroid Build Coastguard Worker 
1238*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned
1239*da0073e9SAndroid Build Coastguard Worker    long) == 4. */
1240*da0073e9SAndroid Build Coastguard Worker 
1241*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
1242*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1243*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1244*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
1245*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1246*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1247*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1248*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1249*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1250*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1251*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1252*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1253*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1254*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1255*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1256*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1257*da0073e9SAndroid Build Coastguard Worker    } while (0)
1258*da0073e9SAndroid Build Coastguard Worker 
1259*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
1260*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1261*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1262*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                          \
1263*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1264*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1265*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1266*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1267*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1268*da0073e9SAndroid Build Coastguard Worker          "subl $12, %%esp\n\t"                                    \
1269*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1270*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1271*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1272*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1273*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1274*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1275*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1276*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1277*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1278*da0073e9SAndroid Build Coastguard Worker    } while (0)
1279*da0073e9SAndroid Build Coastguard Worker 
1280*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
1281*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1282*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1283*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
1284*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1285*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1286*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1287*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1288*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1289*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1290*da0073e9SAndroid Build Coastguard Worker          "subl $8, %%esp\n\t"                                     \
1291*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1292*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1293*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1294*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1295*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1296*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1297*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1298*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1299*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1300*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1301*da0073e9SAndroid Build Coastguard Worker    } while (0)
1302*da0073e9SAndroid Build Coastguard Worker 
1303*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
1304*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1305*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1306*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
1307*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1308*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1309*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1310*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1311*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1312*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1313*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1314*da0073e9SAndroid Build Coastguard Worker          "subl $4, %%esp\n\t"                                     \
1315*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1316*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1317*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1318*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1319*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1320*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1321*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1322*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1323*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1324*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1325*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1326*da0073e9SAndroid Build Coastguard Worker    } while (0)
1327*da0073e9SAndroid Build Coastguard Worker 
1328*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
1329*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1330*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1331*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
1332*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1333*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1334*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1335*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1336*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1337*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1338*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1339*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1340*da0073e9SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1341*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1342*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1343*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1344*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1345*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1346*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1347*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1348*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1349*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1350*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1351*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1352*da0073e9SAndroid Build Coastguard Worker    } while (0)
1353*da0073e9SAndroid Build Coastguard Worker 
1354*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
1355*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1356*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1357*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
1358*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1359*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1360*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1361*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1362*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1363*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1364*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1365*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1366*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1367*da0073e9SAndroid Build Coastguard Worker          "subl $12, %%esp\n\t"                                    \
1368*da0073e9SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1369*da0073e9SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1370*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1371*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1372*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1373*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1374*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1375*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1376*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1377*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1378*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1379*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1380*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1381*da0073e9SAndroid Build Coastguard Worker    } while (0)
1382*da0073e9SAndroid Build Coastguard Worker 
1383*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
1384*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1385*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1386*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
1387*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1388*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1389*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1390*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1391*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1392*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1393*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1394*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1395*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1396*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1397*da0073e9SAndroid Build Coastguard Worker          "subl $8, %%esp\n\t"                                     \
1398*da0073e9SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1399*da0073e9SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1400*da0073e9SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1401*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1402*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1403*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1404*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1405*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1406*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1407*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1408*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1409*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1410*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1411*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1412*da0073e9SAndroid Build Coastguard Worker    } while (0)
1413*da0073e9SAndroid Build Coastguard Worker 
1414*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1415*da0073e9SAndroid Build Coastguard Worker                                  arg7)                            \
1416*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1417*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1418*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
1419*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1420*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1421*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1422*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1423*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1424*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1425*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1426*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1427*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1428*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1429*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1430*da0073e9SAndroid Build Coastguard Worker          "subl $4, %%esp\n\t"                                     \
1431*da0073e9SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1432*da0073e9SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1433*da0073e9SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1434*da0073e9SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1435*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1436*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1437*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1438*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1439*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1440*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1441*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1442*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1443*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1444*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1445*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1446*da0073e9SAndroid Build Coastguard Worker    } while (0)
1447*da0073e9SAndroid Build Coastguard Worker 
1448*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1449*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
1450*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1451*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1452*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
1453*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1454*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1455*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1456*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1457*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1458*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1459*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1460*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1461*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1462*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1463*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1464*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1465*da0073e9SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1466*da0073e9SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1467*da0073e9SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1468*da0073e9SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1469*da0073e9SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1470*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1471*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1472*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1473*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1474*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1475*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1476*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1477*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1478*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1479*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1480*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1481*da0073e9SAndroid Build Coastguard Worker    } while (0)
1482*da0073e9SAndroid Build Coastguard Worker 
1483*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1484*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
1485*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1486*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1487*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
1488*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1489*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1490*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1491*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1492*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1493*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1494*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1495*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1496*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1497*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1498*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1499*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1500*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1501*da0073e9SAndroid Build Coastguard Worker          "subl $12, %%esp\n\t"                                    \
1502*da0073e9SAndroid Build Coastguard Worker          "pushl 36(%%eax)\n\t"                                    \
1503*da0073e9SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1504*da0073e9SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1505*da0073e9SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1506*da0073e9SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1507*da0073e9SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1508*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1509*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1510*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1511*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1512*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1513*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1514*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1515*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1516*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1517*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1518*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1519*da0073e9SAndroid Build Coastguard Worker    } while (0)
1520*da0073e9SAndroid Build Coastguard Worker 
1521*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
1522*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
1523*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1524*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1525*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
1526*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1527*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1528*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1529*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1530*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1531*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1532*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1533*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1534*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1535*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1536*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1537*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
1538*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1539*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1540*da0073e9SAndroid Build Coastguard Worker          "subl $8, %%esp\n\t"                                     \
1541*da0073e9SAndroid Build Coastguard Worker          "pushl 40(%%eax)\n\t"                                    \
1542*da0073e9SAndroid Build Coastguard Worker          "pushl 36(%%eax)\n\t"                                    \
1543*da0073e9SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1544*da0073e9SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1545*da0073e9SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1546*da0073e9SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1547*da0073e9SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1548*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1549*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1550*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1551*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1552*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1553*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1554*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1555*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1556*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1557*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1558*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1559*da0073e9SAndroid Build Coastguard Worker    } while (0)
1560*da0073e9SAndroid Build Coastguard Worker 
1561*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
1562*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
1563*da0073e9SAndroid Build Coastguard Worker                                   arg11)                          \
1564*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1565*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1566*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
1567*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1568*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1569*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1570*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1571*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1572*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1573*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1574*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1575*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1576*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1577*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1578*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
1579*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
1580*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1581*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1582*da0073e9SAndroid Build Coastguard Worker          "subl $4, %%esp\n\t"                                     \
1583*da0073e9SAndroid Build Coastguard Worker          "pushl 44(%%eax)\n\t"                                    \
1584*da0073e9SAndroid Build Coastguard Worker          "pushl 40(%%eax)\n\t"                                    \
1585*da0073e9SAndroid Build Coastguard Worker          "pushl 36(%%eax)\n\t"                                    \
1586*da0073e9SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1587*da0073e9SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1588*da0073e9SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1589*da0073e9SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1590*da0073e9SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1591*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1592*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1593*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1594*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1595*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1596*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1597*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1598*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1599*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1600*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1601*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1602*da0073e9SAndroid Build Coastguard Worker    } while (0)
1603*da0073e9SAndroid Build Coastguard Worker 
1604*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
1605*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
1606*da0073e9SAndroid Build Coastguard Worker                                   arg11,arg12)                    \
1607*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
1608*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1609*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
1610*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1611*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1612*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1613*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1614*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1615*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1616*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1617*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1618*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1619*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1620*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1621*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
1622*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
1623*da0073e9SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)(arg12);                       \
1624*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1625*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
1626*da0073e9SAndroid Build Coastguard Worker          "pushl 48(%%eax)\n\t"                                    \
1627*da0073e9SAndroid Build Coastguard Worker          "pushl 44(%%eax)\n\t"                                    \
1628*da0073e9SAndroid Build Coastguard Worker          "pushl 40(%%eax)\n\t"                                    \
1629*da0073e9SAndroid Build Coastguard Worker          "pushl 36(%%eax)\n\t"                                    \
1630*da0073e9SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1631*da0073e9SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1632*da0073e9SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1633*da0073e9SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1634*da0073e9SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1635*da0073e9SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1636*da0073e9SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1637*da0073e9SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1638*da0073e9SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1639*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1640*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
1641*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1642*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1643*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi"   \
1644*da0073e9SAndroid Build Coastguard Worker       );                                                          \
1645*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1646*da0073e9SAndroid Build Coastguard Worker    } while (0)
1647*da0073e9SAndroid Build Coastguard Worker 
1648*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_x86_linux || PLAT_x86_darwin || PLAT_x86_solaris */
1649*da0073e9SAndroid Build Coastguard Worker 
1650*da0073e9SAndroid Build Coastguard Worker /* ---------------- amd64-{linux,darwin,solaris} --------------- */
1651*da0073e9SAndroid Build Coastguard Worker 
1652*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin) \
1653*da0073e9SAndroid Build Coastguard Worker     ||  defined(PLAT_amd64_solaris)
1654*da0073e9SAndroid Build Coastguard Worker 
1655*da0073e9SAndroid Build Coastguard Worker /* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */
1656*da0073e9SAndroid Build Coastguard Worker 
1657*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
1658*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi",       \
1659*da0073e9SAndroid Build Coastguard Worker                             "rdi", "r8", "r9", "r10", "r11"
1660*da0073e9SAndroid Build Coastguard Worker 
1661*da0073e9SAndroid Build Coastguard Worker /* This is all pretty complex.  It's so as to make stack unwinding
1662*da0073e9SAndroid Build Coastguard Worker    work reliably.  See bug 243270.  The basic problem is the sub and
1663*da0073e9SAndroid Build Coastguard Worker    add of 128 of %rsp in all of the following macros.  If gcc believes
1664*da0073e9SAndroid Build Coastguard Worker    the CFA is in %rsp, then unwinding may fail, because what's at the
1665*da0073e9SAndroid Build Coastguard Worker    CFA is not what gcc "expected" when it constructs the CFIs for the
1666*da0073e9SAndroid Build Coastguard Worker    places where the macros are instantiated.
1667*da0073e9SAndroid Build Coastguard Worker 
1668*da0073e9SAndroid Build Coastguard Worker    But we can't just add a CFI annotation to increase the CFA offset
1669*da0073e9SAndroid Build Coastguard Worker    by 128, to match the sub of 128 from %rsp, because we don't know
1670*da0073e9SAndroid Build Coastguard Worker    whether gcc has chosen %rsp as the CFA at that point, or whether it
1671*da0073e9SAndroid Build Coastguard Worker    has chosen some other register (eg, %rbp).  In the latter case,
1672*da0073e9SAndroid Build Coastguard Worker    adding a CFI annotation to change the CFA offset is simply wrong.
1673*da0073e9SAndroid Build Coastguard Worker 
1674*da0073e9SAndroid Build Coastguard Worker    So the solution is to get hold of the CFA using
1675*da0073e9SAndroid Build Coastguard Worker    __builtin_dwarf_cfa(), put it in a known register, and add a
1676*da0073e9SAndroid Build Coastguard Worker    CFI annotation to say what the register is.  We choose %rbp for
1677*da0073e9SAndroid Build Coastguard Worker    this (perhaps perversely), because:
1678*da0073e9SAndroid Build Coastguard Worker 
1679*da0073e9SAndroid Build Coastguard Worker    (1) %rbp is already subject to unwinding.  If a new register was
1680*da0073e9SAndroid Build Coastguard Worker        chosen then the unwinder would have to unwind it in all stack
1681*da0073e9SAndroid Build Coastguard Worker        traces, which is expensive, and
1682*da0073e9SAndroid Build Coastguard Worker 
1683*da0073e9SAndroid Build Coastguard Worker    (2) %rbp is already subject to precise exception updates in the
1684*da0073e9SAndroid Build Coastguard Worker        JIT.  If a new register was chosen, we'd have to have precise
1685*da0073e9SAndroid Build Coastguard Worker        exceptions for it too, which reduces performance of the
1686*da0073e9SAndroid Build Coastguard Worker        generated code.
1687*da0073e9SAndroid Build Coastguard Worker 
1688*da0073e9SAndroid Build Coastguard Worker    However .. one extra complication.  We can't just whack the result
1689*da0073e9SAndroid Build Coastguard Worker    of __builtin_dwarf_cfa() into %rbp and then add %rbp to the
1690*da0073e9SAndroid Build Coastguard Worker    list of trashed registers at the end of the inline assembly
1691*da0073e9SAndroid Build Coastguard Worker    fragments; gcc won't allow %rbp to appear in that list.  Hence
1692*da0073e9SAndroid Build Coastguard Worker    instead we need to stash %rbp in %r15 for the duration of the asm,
1693*da0073e9SAndroid Build Coastguard Worker    and say that %r15 is trashed instead.  gcc seems happy to go with
1694*da0073e9SAndroid Build Coastguard Worker    that.
1695*da0073e9SAndroid Build Coastguard Worker 
1696*da0073e9SAndroid Build Coastguard Worker    Oh .. and this all needs to be conditionalised so that it is
1697*da0073e9SAndroid Build Coastguard Worker    unchanged from before this commit, when compiled with older gccs
1698*da0073e9SAndroid Build Coastguard Worker    that don't support __builtin_dwarf_cfa.  Furthermore, since
1699*da0073e9SAndroid Build Coastguard Worker    this header file is freestanding, it has to be independent of
1700*da0073e9SAndroid Build Coastguard Worker    config.h, and so the following conditionalisation cannot depend on
1701*da0073e9SAndroid Build Coastguard Worker    configure time checks.
1702*da0073e9SAndroid Build Coastguard Worker 
1703*da0073e9SAndroid Build Coastguard Worker    Although it's not clear from
1704*da0073e9SAndroid Build Coastguard Worker    'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)',
1705*da0073e9SAndroid Build Coastguard Worker    this expression excludes Darwin.
1706*da0073e9SAndroid Build Coastguard Worker    .cfi directives in Darwin assembly appear to be completely
1707*da0073e9SAndroid Build Coastguard Worker    different and I haven't investigated how they work.
1708*da0073e9SAndroid Build Coastguard Worker 
1709*da0073e9SAndroid Build Coastguard Worker    For even more entertainment value, note we have to use the
1710*da0073e9SAndroid Build Coastguard Worker    completely undocumented __builtin_dwarf_cfa(), which appears to
1711*da0073e9SAndroid Build Coastguard Worker    really compute the CFA, whereas __builtin_frame_address(0) claims
1712*da0073e9SAndroid Build Coastguard Worker    to but actually doesn't.  See
1713*da0073e9SAndroid Build Coastguard Worker    https://bugs.kde.org/show_bug.cgi?id=243270#c47
1714*da0073e9SAndroid Build Coastguard Worker */
1715*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
1716*da0073e9SAndroid Build Coastguard Worker #  define __FRAME_POINTER                                         \
1717*da0073e9SAndroid Build Coastguard Worker       ,"r"(__builtin_dwarf_cfa())
1718*da0073e9SAndroid Build Coastguard Worker #  define VALGRIND_CFI_PROLOGUE                                   \
1719*da0073e9SAndroid Build Coastguard Worker       "movq %%rbp, %%r15\n\t"                                     \
1720*da0073e9SAndroid Build Coastguard Worker       "movq %2, %%rbp\n\t"                                        \
1721*da0073e9SAndroid Build Coastguard Worker       ".cfi_remember_state\n\t"                                   \
1722*da0073e9SAndroid Build Coastguard Worker       ".cfi_def_cfa rbp, 0\n\t"
1723*da0073e9SAndroid Build Coastguard Worker #  define VALGRIND_CFI_EPILOGUE                                   \
1724*da0073e9SAndroid Build Coastguard Worker       "movq %%r15, %%rbp\n\t"                                     \
1725*da0073e9SAndroid Build Coastguard Worker       ".cfi_restore_state\n\t"
1726*da0073e9SAndroid Build Coastguard Worker #else
1727*da0073e9SAndroid Build Coastguard Worker #  define __FRAME_POINTER
1728*da0073e9SAndroid Build Coastguard Worker #  define VALGRIND_CFI_PROLOGUE
1729*da0073e9SAndroid Build Coastguard Worker #  define VALGRIND_CFI_EPILOGUE
1730*da0073e9SAndroid Build Coastguard Worker #endif
1731*da0073e9SAndroid Build Coastguard Worker 
1732*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
1733*da0073e9SAndroid Build Coastguard Worker    call and restore it afterwards as gcc may not keep the stack
1734*da0073e9SAndroid Build Coastguard Worker    pointer aligned if it doesn't realise calls are being made
1735*da0073e9SAndroid Build Coastguard Worker    to other functions. */
1736*da0073e9SAndroid Build Coastguard Worker 
1737*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK               \
1738*da0073e9SAndroid Build Coastguard Worker       "movq %%rsp,%%r14\n\t"               \
1739*da0073e9SAndroid Build Coastguard Worker       "andq $0xfffffffffffffff0,%%rsp\n\t"
1740*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK             \
1741*da0073e9SAndroid Build Coastguard Worker       "movq %%r14,%%rsp\n\t"
1742*da0073e9SAndroid Build Coastguard Worker 
1743*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned
1744*da0073e9SAndroid Build Coastguard Worker    long) == 8. */
1745*da0073e9SAndroid Build Coastguard Worker 
1746*da0073e9SAndroid Build Coastguard Worker /* NB 9 Sept 07.  There is a nasty kludge here in all these CALL_FN_
1747*da0073e9SAndroid Build Coastguard Worker    macros.  In order not to trash the stack redzone, we need to drop
1748*da0073e9SAndroid Build Coastguard Worker    %rsp by 128 before the hidden call, and restore afterwards.  The
1749*da0073e9SAndroid Build Coastguard Worker    nastyness is that it is only by luck that the stack still appears
1750*da0073e9SAndroid Build Coastguard Worker    to be unwindable during the hidden call - since then the behaviour
1751*da0073e9SAndroid Build Coastguard Worker    of any routine using this macro does not match what the CFI data
1752*da0073e9SAndroid Build Coastguard Worker    says.  Sigh.
1753*da0073e9SAndroid Build Coastguard Worker 
1754*da0073e9SAndroid Build Coastguard Worker    Why is this important?  Imagine that a wrapper has a stack
1755*da0073e9SAndroid Build Coastguard Worker    allocated local, and passes to the hidden call, a pointer to it.
1756*da0073e9SAndroid Build Coastguard Worker    Because gcc does not know about the hidden call, it may allocate
1757*da0073e9SAndroid Build Coastguard Worker    that local in the redzone.  Unfortunately the hidden call may then
1758*da0073e9SAndroid Build Coastguard Worker    trash it before it comes to use it.  So we must step clear of the
1759*da0073e9SAndroid Build Coastguard Worker    redzone, for the duration of the hidden call, to make it safe.
1760*da0073e9SAndroid Build Coastguard Worker 
1761*da0073e9SAndroid Build Coastguard Worker    Probably the same problem afflicts the other redzone-style ABIs too
1762*da0073e9SAndroid Build Coastguard Worker    (ppc64-linux); but for those, the stack is
1763*da0073e9SAndroid Build Coastguard Worker    self describing (none of this CFI nonsense) so at least messing
1764*da0073e9SAndroid Build Coastguard Worker    with the stack pointer doesn't give a danger of non-unwindable
1765*da0073e9SAndroid Build Coastguard Worker    stack. */
1766*da0073e9SAndroid Build Coastguard Worker 
1767*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                        \
1768*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
1769*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
1770*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                               \
1771*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
1772*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
1773*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
1774*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
1775*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
1776*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
1777*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
1778*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
1779*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
1780*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
1781*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
1782*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
1783*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1784*da0073e9SAndroid Build Coastguard Worker       );                                                               \
1785*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
1786*da0073e9SAndroid Build Coastguard Worker    } while (0)
1787*da0073e9SAndroid Build Coastguard Worker 
1788*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                                  \
1789*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
1790*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
1791*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                               \
1792*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
1793*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
1794*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
1795*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
1796*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
1797*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
1798*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
1799*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
1800*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
1801*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
1802*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
1803*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
1804*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
1805*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
1806*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1807*da0073e9SAndroid Build Coastguard Worker       );                                                               \
1808*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
1809*da0073e9SAndroid Build Coastguard Worker    } while (0)
1810*da0073e9SAndroid Build Coastguard Worker 
1811*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                            \
1812*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
1813*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
1814*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                               \
1815*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
1816*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
1817*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
1818*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
1819*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
1820*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
1821*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
1822*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
1823*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
1824*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
1825*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
1826*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
1827*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
1828*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
1829*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
1830*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
1831*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1832*da0073e9SAndroid Build Coastguard Worker       );                                                               \
1833*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
1834*da0073e9SAndroid Build Coastguard Worker    } while (0)
1835*da0073e9SAndroid Build Coastguard Worker 
1836*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                      \
1837*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
1838*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
1839*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                               \
1840*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
1841*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
1842*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
1843*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
1844*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
1845*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
1846*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
1847*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
1848*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
1849*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
1850*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
1851*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
1852*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
1853*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
1854*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
1855*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
1856*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
1857*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
1858*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1859*da0073e9SAndroid Build Coastguard Worker       );                                                               \
1860*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
1861*da0073e9SAndroid Build Coastguard Worker    } while (0)
1862*da0073e9SAndroid Build Coastguard Worker 
1863*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)                \
1864*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
1865*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
1866*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                               \
1867*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
1868*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
1869*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
1870*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
1871*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
1872*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                              \
1873*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
1874*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
1875*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
1876*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
1877*da0073e9SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                                   \
1878*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
1879*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
1880*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
1881*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
1882*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
1883*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
1884*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
1885*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
1886*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
1887*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1888*da0073e9SAndroid Build Coastguard Worker       );                                                               \
1889*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
1890*da0073e9SAndroid Build Coastguard Worker    } while (0)
1891*da0073e9SAndroid Build Coastguard Worker 
1892*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)             \
1893*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
1894*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
1895*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                               \
1896*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
1897*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
1898*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
1899*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
1900*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
1901*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                              \
1902*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                              \
1903*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
1904*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
1905*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
1906*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
1907*da0073e9SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                                    \
1908*da0073e9SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                                   \
1909*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
1910*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
1911*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
1912*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
1913*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
1914*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
1915*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
1916*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
1917*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
1918*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1919*da0073e9SAndroid Build Coastguard Worker       );                                                               \
1920*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
1921*da0073e9SAndroid Build Coastguard Worker    } while (0)
1922*da0073e9SAndroid Build Coastguard Worker 
1923*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)        \
1924*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
1925*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
1926*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                               \
1927*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
1928*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
1929*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
1930*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
1931*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
1932*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                              \
1933*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                              \
1934*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                              \
1935*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
1936*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
1937*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
1938*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
1939*da0073e9SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                                    \
1940*da0073e9SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                                    \
1941*da0073e9SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                                   \
1942*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
1943*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
1944*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
1945*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
1946*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
1947*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
1948*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
1949*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
1950*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
1951*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1952*da0073e9SAndroid Build Coastguard Worker       );                                                               \
1953*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
1954*da0073e9SAndroid Build Coastguard Worker    } while (0)
1955*da0073e9SAndroid Build Coastguard Worker 
1956*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,        \
1957*da0073e9SAndroid Build Coastguard Worker                                  arg7)                                 \
1958*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
1959*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
1960*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                               \
1961*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
1962*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
1963*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
1964*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
1965*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
1966*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                              \
1967*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                              \
1968*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                              \
1969*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                              \
1970*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
1971*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
1972*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
1973*da0073e9SAndroid Build Coastguard Worker          "subq $136,%%rsp\n\t"                                         \
1974*da0073e9SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                         \
1975*da0073e9SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                                    \
1976*da0073e9SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                                    \
1977*da0073e9SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                                   \
1978*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
1979*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
1980*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
1981*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
1982*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
1983*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
1984*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
1985*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
1986*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
1987*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1988*da0073e9SAndroid Build Coastguard Worker       );                                                               \
1989*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
1990*da0073e9SAndroid Build Coastguard Worker    } while (0)
1991*da0073e9SAndroid Build Coastguard Worker 
1992*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,        \
1993*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                            \
1994*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
1995*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
1996*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                               \
1997*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
1998*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
1999*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
2000*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
2001*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
2002*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                              \
2003*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                              \
2004*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                              \
2005*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                              \
2006*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                              \
2007*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
2008*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
2009*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
2010*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
2011*da0073e9SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                         \
2012*da0073e9SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                         \
2013*da0073e9SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                                    \
2014*da0073e9SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                                    \
2015*da0073e9SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                                   \
2016*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
2017*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
2018*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
2019*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
2020*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
2021*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
2022*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
2023*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
2024*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
2025*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2026*da0073e9SAndroid Build Coastguard Worker       );                                                               \
2027*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
2028*da0073e9SAndroid Build Coastguard Worker    } while (0)
2029*da0073e9SAndroid Build Coastguard Worker 
2030*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,        \
2031*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                       \
2032*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
2033*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
2034*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                              \
2035*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
2036*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
2037*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
2038*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
2039*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
2040*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                              \
2041*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                              \
2042*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                              \
2043*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                              \
2044*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                              \
2045*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                              \
2046*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
2047*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
2048*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
2049*da0073e9SAndroid Build Coastguard Worker          "subq $136,%%rsp\n\t"                                         \
2050*da0073e9SAndroid Build Coastguard Worker          "pushq 72(%%rax)\n\t"                                         \
2051*da0073e9SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                         \
2052*da0073e9SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                         \
2053*da0073e9SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                                    \
2054*da0073e9SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                                    \
2055*da0073e9SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                                   \
2056*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
2057*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
2058*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
2059*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
2060*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
2061*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
2062*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
2063*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
2064*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
2065*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2066*da0073e9SAndroid Build Coastguard Worker       );                                                               \
2067*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
2068*da0073e9SAndroid Build Coastguard Worker    } while (0)
2069*da0073e9SAndroid Build Coastguard Worker 
2070*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,       \
2071*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)                \
2072*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
2073*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
2074*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                              \
2075*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
2076*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
2077*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
2078*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
2079*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
2080*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                              \
2081*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                              \
2082*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                              \
2083*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                              \
2084*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                              \
2085*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                              \
2086*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                            \
2087*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
2088*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
2089*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
2090*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
2091*da0073e9SAndroid Build Coastguard Worker          "pushq 80(%%rax)\n\t"                                         \
2092*da0073e9SAndroid Build Coastguard Worker          "pushq 72(%%rax)\n\t"                                         \
2093*da0073e9SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                         \
2094*da0073e9SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                         \
2095*da0073e9SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                                    \
2096*da0073e9SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                                    \
2097*da0073e9SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                                   \
2098*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
2099*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
2100*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
2101*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
2102*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
2103*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
2104*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
2105*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
2106*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
2107*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2108*da0073e9SAndroid Build Coastguard Worker       );                                                               \
2109*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
2110*da0073e9SAndroid Build Coastguard Worker    } while (0)
2111*da0073e9SAndroid Build Coastguard Worker 
2112*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,       \
2113*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)          \
2114*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
2115*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
2116*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                              \
2117*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
2118*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
2119*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
2120*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
2121*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
2122*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                              \
2123*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                              \
2124*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                              \
2125*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                              \
2126*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                              \
2127*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                              \
2128*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                            \
2129*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                            \
2130*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
2131*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
2132*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
2133*da0073e9SAndroid Build Coastguard Worker          "subq $136,%%rsp\n\t"                                         \
2134*da0073e9SAndroid Build Coastguard Worker          "pushq 88(%%rax)\n\t"                                         \
2135*da0073e9SAndroid Build Coastguard Worker          "pushq 80(%%rax)\n\t"                                         \
2136*da0073e9SAndroid Build Coastguard Worker          "pushq 72(%%rax)\n\t"                                         \
2137*da0073e9SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                         \
2138*da0073e9SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                         \
2139*da0073e9SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                                    \
2140*da0073e9SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                                    \
2141*da0073e9SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                                   \
2142*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
2143*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
2144*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
2145*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
2146*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
2147*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
2148*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
2149*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
2150*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
2151*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2152*da0073e9SAndroid Build Coastguard Worker       );                                                               \
2153*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
2154*da0073e9SAndroid Build Coastguard Worker    } while (0)
2155*da0073e9SAndroid Build Coastguard Worker 
2156*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,       \
2157*da0073e9SAndroid Build Coastguard Worker                                 arg7,arg8,arg9,arg10,arg11,arg12)      \
2158*da0073e9SAndroid Build Coastguard Worker    do {                                                                \
2159*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                           \
2160*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                              \
2161*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                     \
2162*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                        \
2163*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                              \
2164*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                              \
2165*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                              \
2166*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                              \
2167*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                              \
2168*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                              \
2169*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                              \
2170*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                              \
2171*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                              \
2172*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                            \
2173*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                            \
2174*da0073e9SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)(arg12);                            \
2175*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                                \
2176*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                         \
2177*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                          \
2178*da0073e9SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                         \
2179*da0073e9SAndroid Build Coastguard Worker          "pushq 96(%%rax)\n\t"                                         \
2180*da0073e9SAndroid Build Coastguard Worker          "pushq 88(%%rax)\n\t"                                         \
2181*da0073e9SAndroid Build Coastguard Worker          "pushq 80(%%rax)\n\t"                                         \
2182*da0073e9SAndroid Build Coastguard Worker          "pushq 72(%%rax)\n\t"                                         \
2183*da0073e9SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                         \
2184*da0073e9SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                         \
2185*da0073e9SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                                    \
2186*da0073e9SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                                    \
2187*da0073e9SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                                   \
2188*da0073e9SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                                   \
2189*da0073e9SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                                   \
2190*da0073e9SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                                    \
2191*da0073e9SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */                 \
2192*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                     \
2193*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                        \
2194*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                         \
2195*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                       \
2196*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER                 \
2197*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2198*da0073e9SAndroid Build Coastguard Worker       );                                                               \
2199*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                                  \
2200*da0073e9SAndroid Build Coastguard Worker    } while (0)
2201*da0073e9SAndroid Build Coastguard Worker 
2202*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_amd64_linux || PLAT_amd64_darwin || PLAT_amd64_solaris */
2203*da0073e9SAndroid Build Coastguard Worker 
2204*da0073e9SAndroid Build Coastguard Worker /* ------------------------ ppc32-linux ------------------------ */
2205*da0073e9SAndroid Build Coastguard Worker 
2206*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc32_linux)
2207*da0073e9SAndroid Build Coastguard Worker 
2208*da0073e9SAndroid Build Coastguard Worker /* This is useful for finding out about the on-stack stuff:
2209*da0073e9SAndroid Build Coastguard Worker 
2210*da0073e9SAndroid Build Coastguard Worker    extern int f9  ( int,int,int,int,int,int,int,int,int );
2211*da0073e9SAndroid Build Coastguard Worker    extern int f10 ( int,int,int,int,int,int,int,int,int,int );
2212*da0073e9SAndroid Build Coastguard Worker    extern int f11 ( int,int,int,int,int,int,int,int,int,int,int );
2213*da0073e9SAndroid Build Coastguard Worker    extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int );
2214*da0073e9SAndroid Build Coastguard Worker 
2215*da0073e9SAndroid Build Coastguard Worker    int g9 ( void ) {
2216*da0073e9SAndroid Build Coastguard Worker       return f9(11,22,33,44,55,66,77,88,99);
2217*da0073e9SAndroid Build Coastguard Worker    }
2218*da0073e9SAndroid Build Coastguard Worker    int g10 ( void ) {
2219*da0073e9SAndroid Build Coastguard Worker       return f10(11,22,33,44,55,66,77,88,99,110);
2220*da0073e9SAndroid Build Coastguard Worker    }
2221*da0073e9SAndroid Build Coastguard Worker    int g11 ( void ) {
2222*da0073e9SAndroid Build Coastguard Worker       return f11(11,22,33,44,55,66,77,88,99,110,121);
2223*da0073e9SAndroid Build Coastguard Worker    }
2224*da0073e9SAndroid Build Coastguard Worker    int g12 ( void ) {
2225*da0073e9SAndroid Build Coastguard Worker       return f12(11,22,33,44,55,66,77,88,99,110,121,132);
2226*da0073e9SAndroid Build Coastguard Worker    }
2227*da0073e9SAndroid Build Coastguard Worker */
2228*da0073e9SAndroid Build Coastguard Worker 
2229*da0073e9SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
2230*da0073e9SAndroid Build Coastguard Worker 
2231*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
2232*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS                                       \
2233*da0073e9SAndroid Build Coastguard Worker    "lr", "ctr", "xer",                                            \
2234*da0073e9SAndroid Build Coastguard Worker    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
2235*da0073e9SAndroid Build Coastguard Worker    "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
2236*da0073e9SAndroid Build Coastguard Worker    "r11", "r12", "r13"
2237*da0073e9SAndroid Build Coastguard Worker 
2238*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
2239*da0073e9SAndroid Build Coastguard Worker    call and restore it afterwards as gcc may not keep the stack
2240*da0073e9SAndroid Build Coastguard Worker    pointer aligned if it doesn't realise calls are being made
2241*da0073e9SAndroid Build Coastguard Worker    to other functions. */
2242*da0073e9SAndroid Build Coastguard Worker 
2243*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK               \
2244*da0073e9SAndroid Build Coastguard Worker       "mr 28,1\n\t"                        \
2245*da0073e9SAndroid Build Coastguard Worker       "rlwinm 1,1,0,0,27\n\t"
2246*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK             \
2247*da0073e9SAndroid Build Coastguard Worker       "mr 1,28\n\t"
2248*da0073e9SAndroid Build Coastguard Worker 
2249*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc32-linux,
2250*da0073e9SAndroid Build Coastguard Worker    sizeof(unsigned long) == 4. */
2251*da0073e9SAndroid Build Coastguard Worker 
2252*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
2253*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2254*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2255*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
2256*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2257*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2258*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2259*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2260*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2261*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2262*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2263*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2264*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2265*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2266*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2267*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2268*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2269*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2270*da0073e9SAndroid Build Coastguard Worker    } while (0)
2271*da0073e9SAndroid Build Coastguard Worker 
2272*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
2273*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2274*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2275*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                          \
2276*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2277*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2278*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2279*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2280*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2281*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2282*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2283*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2284*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2285*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2286*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2287*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2288*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2289*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2290*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2291*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2292*da0073e9SAndroid Build Coastguard Worker    } while (0)
2293*da0073e9SAndroid Build Coastguard Worker 
2294*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
2295*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2296*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2297*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
2298*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2299*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2300*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2301*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2302*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2303*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2304*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2305*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2306*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2307*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2308*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2309*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2310*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2311*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2312*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2313*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2314*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2315*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2316*da0073e9SAndroid Build Coastguard Worker    } while (0)
2317*da0073e9SAndroid Build Coastguard Worker 
2318*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
2319*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2320*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2321*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
2322*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2323*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2324*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2325*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2326*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2327*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2328*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2329*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2330*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2331*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2332*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2333*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2334*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2335*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2336*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2337*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2338*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2339*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2340*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2341*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2342*da0073e9SAndroid Build Coastguard Worker    } while (0)
2343*da0073e9SAndroid Build Coastguard Worker 
2344*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
2345*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2346*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2347*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
2348*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2349*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2350*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2351*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2352*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2353*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2354*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2355*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2356*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2357*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2358*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2359*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2360*da0073e9SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2361*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2362*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2363*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2364*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2365*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2366*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2367*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2368*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2369*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2370*da0073e9SAndroid Build Coastguard Worker    } while (0)
2371*da0073e9SAndroid Build Coastguard Worker 
2372*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
2373*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2374*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2375*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
2376*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2377*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2378*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2379*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2380*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2381*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2382*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2383*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2384*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2385*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2386*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2387*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2388*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2389*da0073e9SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2390*da0073e9SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2391*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2392*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2393*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2394*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2395*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2396*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2397*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2398*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2399*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2400*da0073e9SAndroid Build Coastguard Worker    } while (0)
2401*da0073e9SAndroid Build Coastguard Worker 
2402*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
2403*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2404*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2405*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
2406*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2407*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2408*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2409*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2410*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2411*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2412*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2413*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2414*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2415*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2416*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2417*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2418*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2419*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2420*da0073e9SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2421*da0073e9SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2422*da0073e9SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2423*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2424*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2425*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2426*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2427*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2428*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2429*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2430*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2431*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2432*da0073e9SAndroid Build Coastguard Worker    } while (0)
2433*da0073e9SAndroid Build Coastguard Worker 
2434*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2435*da0073e9SAndroid Build Coastguard Worker                                  arg7)                            \
2436*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2437*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2438*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
2439*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2440*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2441*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2442*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2443*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2444*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2445*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2446*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2447*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2448*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2449*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2450*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2451*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2452*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2453*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2454*da0073e9SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2455*da0073e9SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2456*da0073e9SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2457*da0073e9SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2458*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2459*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2460*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2461*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2462*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2463*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2464*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2465*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2466*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2467*da0073e9SAndroid Build Coastguard Worker    } while (0)
2468*da0073e9SAndroid Build Coastguard Worker 
2469*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2470*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
2471*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2472*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2473*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
2474*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2475*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2476*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2477*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2478*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2479*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2480*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2481*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2482*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2483*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
2484*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2485*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2486*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2487*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2488*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2489*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2490*da0073e9SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2491*da0073e9SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2492*da0073e9SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2493*da0073e9SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2494*da0073e9SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2495*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2496*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2497*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2498*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2499*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2500*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2501*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2502*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2503*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2504*da0073e9SAndroid Build Coastguard Worker    } while (0)
2505*da0073e9SAndroid Build Coastguard Worker 
2506*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2507*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
2508*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2509*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2510*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
2511*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2512*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2513*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2514*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2515*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2516*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2517*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2518*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2519*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2520*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
2521*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                           \
2522*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2523*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2524*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2525*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-16\n\t"                                       \
2526*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
2527*da0073e9SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
2528*da0073e9SAndroid Build Coastguard Worker          "stw 3,8(1)\n\t"                                         \
2529*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2530*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2531*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2532*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2533*da0073e9SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2534*da0073e9SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2535*da0073e9SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2536*da0073e9SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2537*da0073e9SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2538*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2539*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2540*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2541*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2542*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2543*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2544*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2545*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2546*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2547*da0073e9SAndroid Build Coastguard Worker    } while (0)
2548*da0073e9SAndroid Build Coastguard Worker 
2549*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2550*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
2551*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2552*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2553*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
2554*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2555*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2556*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2557*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2558*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2559*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2560*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2561*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2562*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2563*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
2564*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                           \
2565*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)arg10;                         \
2566*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2567*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2568*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2569*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-16\n\t"                                       \
2570*da0073e9SAndroid Build Coastguard Worker          /* arg10 */                                              \
2571*da0073e9SAndroid Build Coastguard Worker          "lwz 3,40(11)\n\t"                                       \
2572*da0073e9SAndroid Build Coastguard Worker          "stw 3,12(1)\n\t"                                        \
2573*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
2574*da0073e9SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
2575*da0073e9SAndroid Build Coastguard Worker          "stw 3,8(1)\n\t"                                         \
2576*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2577*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2578*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2579*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2580*da0073e9SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2581*da0073e9SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2582*da0073e9SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2583*da0073e9SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2584*da0073e9SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2585*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2586*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2587*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2588*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2589*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2590*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2591*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2592*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2593*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2594*da0073e9SAndroid Build Coastguard Worker    } while (0)
2595*da0073e9SAndroid Build Coastguard Worker 
2596*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2597*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)     \
2598*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2599*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2600*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
2601*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2602*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2603*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2604*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2605*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2606*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2607*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2608*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2609*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2610*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
2611*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                           \
2612*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)arg10;                         \
2613*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)arg11;                         \
2614*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2615*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2616*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2617*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-32\n\t"                                       \
2618*da0073e9SAndroid Build Coastguard Worker          /* arg11 */                                              \
2619*da0073e9SAndroid Build Coastguard Worker          "lwz 3,44(11)\n\t"                                       \
2620*da0073e9SAndroid Build Coastguard Worker          "stw 3,16(1)\n\t"                                        \
2621*da0073e9SAndroid Build Coastguard Worker          /* arg10 */                                              \
2622*da0073e9SAndroid Build Coastguard Worker          "lwz 3,40(11)\n\t"                                       \
2623*da0073e9SAndroid Build Coastguard Worker          "stw 3,12(1)\n\t"                                        \
2624*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
2625*da0073e9SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
2626*da0073e9SAndroid Build Coastguard Worker          "stw 3,8(1)\n\t"                                         \
2627*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2628*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2629*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2630*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2631*da0073e9SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2632*da0073e9SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2633*da0073e9SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2634*da0073e9SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2635*da0073e9SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2636*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2637*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2638*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2639*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2640*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2641*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2642*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2643*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2644*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2645*da0073e9SAndroid Build Coastguard Worker    } while (0)
2646*da0073e9SAndroid Build Coastguard Worker 
2647*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2648*da0073e9SAndroid Build Coastguard Worker                                 arg7,arg8,arg9,arg10,arg11,arg12) \
2649*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2650*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2651*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
2652*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2653*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2654*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2655*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2656*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2657*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2658*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2659*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2660*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2661*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
2662*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                           \
2663*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)arg10;                         \
2664*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)arg11;                         \
2665*da0073e9SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)arg12;                         \
2666*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2667*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2668*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2669*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-32\n\t"                                       \
2670*da0073e9SAndroid Build Coastguard Worker          /* arg12 */                                              \
2671*da0073e9SAndroid Build Coastguard Worker          "lwz 3,48(11)\n\t"                                       \
2672*da0073e9SAndroid Build Coastguard Worker          "stw 3,20(1)\n\t"                                        \
2673*da0073e9SAndroid Build Coastguard Worker          /* arg11 */                                              \
2674*da0073e9SAndroid Build Coastguard Worker          "lwz 3,44(11)\n\t"                                       \
2675*da0073e9SAndroid Build Coastguard Worker          "stw 3,16(1)\n\t"                                        \
2676*da0073e9SAndroid Build Coastguard Worker          /* arg10 */                                              \
2677*da0073e9SAndroid Build Coastguard Worker          "lwz 3,40(11)\n\t"                                       \
2678*da0073e9SAndroid Build Coastguard Worker          "stw 3,12(1)\n\t"                                        \
2679*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
2680*da0073e9SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
2681*da0073e9SAndroid Build Coastguard Worker          "stw 3,8(1)\n\t"                                         \
2682*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2683*da0073e9SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2684*da0073e9SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2685*da0073e9SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2686*da0073e9SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2687*da0073e9SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2688*da0073e9SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2689*da0073e9SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2690*da0073e9SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2691*da0073e9SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2692*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2693*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2694*da0073e9SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2695*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2696*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2697*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2698*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2699*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2700*da0073e9SAndroid Build Coastguard Worker    } while (0)
2701*da0073e9SAndroid Build Coastguard Worker 
2702*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc32_linux */
2703*da0073e9SAndroid Build Coastguard Worker 
2704*da0073e9SAndroid Build Coastguard Worker /* ------------------------ ppc64-linux ------------------------ */
2705*da0073e9SAndroid Build Coastguard Worker 
2706*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc64be_linux)
2707*da0073e9SAndroid Build Coastguard Worker 
2708*da0073e9SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
2709*da0073e9SAndroid Build Coastguard Worker 
2710*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
2711*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS                                       \
2712*da0073e9SAndroid Build Coastguard Worker    "lr", "ctr", "xer",                                            \
2713*da0073e9SAndroid Build Coastguard Worker    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
2714*da0073e9SAndroid Build Coastguard Worker    "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",         \
2715*da0073e9SAndroid Build Coastguard Worker    "r11", "r12", "r13"
2716*da0073e9SAndroid Build Coastguard Worker 
2717*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
2718*da0073e9SAndroid Build Coastguard Worker    call and restore it afterwards as gcc may not keep the stack
2719*da0073e9SAndroid Build Coastguard Worker    pointer aligned if it doesn't realise calls are being made
2720*da0073e9SAndroid Build Coastguard Worker    to other functions. */
2721*da0073e9SAndroid Build Coastguard Worker 
2722*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK               \
2723*da0073e9SAndroid Build Coastguard Worker       "mr 28,1\n\t"                        \
2724*da0073e9SAndroid Build Coastguard Worker       "rldicr 1,1,0,59\n\t"
2725*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK             \
2726*da0073e9SAndroid Build Coastguard Worker       "mr 1,28\n\t"
2727*da0073e9SAndroid Build Coastguard Worker 
2728*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
2729*da0073e9SAndroid Build Coastguard Worker    long) == 8. */
2730*da0073e9SAndroid Build Coastguard Worker 
2731*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
2732*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2733*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2734*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+0];                        \
2735*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2736*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2737*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)_orig.r2;                       \
2738*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)_orig.nraddr;                   \
2739*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2740*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2741*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2742*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2743*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2744*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2745*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2746*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2747*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2748*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2749*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2750*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2751*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2752*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2753*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2754*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2755*da0073e9SAndroid Build Coastguard Worker    } while (0)
2756*da0073e9SAndroid Build Coastguard Worker 
2757*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
2758*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2759*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2760*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+1];                        \
2761*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2762*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2763*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2764*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2765*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2766*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2767*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2768*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2769*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2770*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2771*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2772*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2773*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2774*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2775*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2776*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2777*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2778*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2779*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2780*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2781*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2782*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2783*da0073e9SAndroid Build Coastguard Worker    } while (0)
2784*da0073e9SAndroid Build Coastguard Worker 
2785*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
2786*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2787*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2788*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+2];                        \
2789*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2790*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2791*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2792*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2793*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2794*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2795*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2796*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2797*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2798*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2799*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2800*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2801*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2802*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2803*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2804*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2805*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2806*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2807*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2808*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2809*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2810*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2811*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2812*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2813*da0073e9SAndroid Build Coastguard Worker    } while (0)
2814*da0073e9SAndroid Build Coastguard Worker 
2815*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
2816*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2817*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2818*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+3];                        \
2819*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2820*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2821*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2822*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2823*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2824*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2825*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2826*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2827*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2828*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2829*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2830*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2831*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2832*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2833*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2834*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2835*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2836*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2837*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2838*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2839*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2840*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2841*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2842*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2843*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2844*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2845*da0073e9SAndroid Build Coastguard Worker    } while (0)
2846*da0073e9SAndroid Build Coastguard Worker 
2847*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
2848*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2849*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2850*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+4];                        \
2851*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2852*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2853*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2854*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2855*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2856*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2857*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2858*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2859*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2860*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2861*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2862*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2863*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2864*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2865*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2866*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2867*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2868*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2869*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2870*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2871*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2872*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2873*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2874*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2875*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2876*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2877*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2878*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2879*da0073e9SAndroid Build Coastguard Worker    } while (0)
2880*da0073e9SAndroid Build Coastguard Worker 
2881*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
2882*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2883*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2884*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+5];                        \
2885*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2886*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2887*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2888*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2889*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2890*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2891*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2892*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2893*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2894*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2895*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2896*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2897*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2898*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2899*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2900*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2901*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2902*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2903*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2904*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2905*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2906*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2907*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2908*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2909*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2910*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2911*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2912*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2913*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2914*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2915*da0073e9SAndroid Build Coastguard Worker    } while (0)
2916*da0073e9SAndroid Build Coastguard Worker 
2917*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
2918*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2919*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2920*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+6];                        \
2921*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2922*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2923*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2924*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2925*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2926*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2927*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2928*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2929*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2930*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
2931*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2932*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2933*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2934*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2935*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2936*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2937*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2938*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2939*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2940*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2941*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2942*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2943*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2944*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2945*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2946*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2947*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2948*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2949*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2950*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2951*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2952*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2953*da0073e9SAndroid Build Coastguard Worker    } while (0)
2954*da0073e9SAndroid Build Coastguard Worker 
2955*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2956*da0073e9SAndroid Build Coastguard Worker                                  arg7)                            \
2957*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2958*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2959*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+7];                        \
2960*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2961*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2962*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2963*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2964*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2965*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2966*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2967*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2968*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2969*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
2970*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
2971*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2972*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
2973*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2974*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2975*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2976*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2977*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2978*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2979*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2980*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2981*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2982*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2983*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2984*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2985*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2986*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2987*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2988*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
2989*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2990*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2991*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
2992*da0073e9SAndroid Build Coastguard Worker       );                                                          \
2993*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2994*da0073e9SAndroid Build Coastguard Worker    } while (0)
2995*da0073e9SAndroid Build Coastguard Worker 
2996*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2997*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
2998*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
2999*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3000*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+8];                        \
3001*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3002*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3003*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3004*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3005*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3006*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3007*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3008*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3009*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3010*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3011*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3012*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3013*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3014*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3015*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3016*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
3017*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3018*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3019*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3020*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3021*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
3022*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
3023*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
3024*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
3025*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
3026*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3027*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3028*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3029*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3030*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
3031*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3032*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3033*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3034*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3035*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3036*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3037*da0073e9SAndroid Build Coastguard Worker    } while (0)
3038*da0073e9SAndroid Build Coastguard Worker 
3039*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
3040*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
3041*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3042*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3043*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+9];                        \
3044*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3045*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3046*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3047*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3048*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3049*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3050*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3051*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3052*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3053*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3054*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3055*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3056*da0073e9SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3057*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3058*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3059*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3060*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
3061*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3062*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-128\n\t"  /* expand stack frame */            \
3063*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
3064*da0073e9SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
3065*da0073e9SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
3066*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3067*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3068*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3069*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3070*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
3071*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
3072*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
3073*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
3074*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
3075*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3076*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3077*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3078*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3079*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
3080*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3081*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3082*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3083*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3084*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3085*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3086*da0073e9SAndroid Build Coastguard Worker    } while (0)
3087*da0073e9SAndroid Build Coastguard Worker 
3088*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
3089*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
3090*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3091*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3092*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+10];                       \
3093*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3094*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3095*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3096*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3097*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3098*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3099*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3100*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3101*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3102*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3103*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3104*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3105*da0073e9SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3106*da0073e9SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
3107*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3108*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3109*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3110*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
3111*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3112*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-128\n\t"  /* expand stack frame */            \
3113*da0073e9SAndroid Build Coastguard Worker          /* arg10 */                                              \
3114*da0073e9SAndroid Build Coastguard Worker          "ld  3,80(11)\n\t"                                       \
3115*da0073e9SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
3116*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
3117*da0073e9SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
3118*da0073e9SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
3119*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3120*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3121*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3122*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3123*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
3124*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
3125*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
3126*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
3127*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
3128*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3129*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3130*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3131*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3132*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
3133*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3134*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3135*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3136*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3137*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3138*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3139*da0073e9SAndroid Build Coastguard Worker    } while (0)
3140*da0073e9SAndroid Build Coastguard Worker 
3141*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
3142*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)     \
3143*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3144*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3145*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+11];                       \
3146*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3147*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3148*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3149*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3150*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3151*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3152*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3153*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3154*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3155*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3156*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3157*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3158*da0073e9SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3159*da0073e9SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
3160*da0073e9SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
3161*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3162*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3163*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3164*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
3165*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3166*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-144\n\t"  /* expand stack frame */            \
3167*da0073e9SAndroid Build Coastguard Worker          /* arg11 */                                              \
3168*da0073e9SAndroid Build Coastguard Worker          "ld  3,88(11)\n\t"                                       \
3169*da0073e9SAndroid Build Coastguard Worker          "std 3,128(1)\n\t"                                       \
3170*da0073e9SAndroid Build Coastguard Worker          /* arg10 */                                              \
3171*da0073e9SAndroid Build Coastguard Worker          "ld  3,80(11)\n\t"                                       \
3172*da0073e9SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
3173*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
3174*da0073e9SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
3175*da0073e9SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
3176*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3177*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3178*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3179*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3180*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
3181*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
3182*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
3183*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
3184*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
3185*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3186*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3187*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3188*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3189*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
3190*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3191*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3192*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3193*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3194*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3195*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3196*da0073e9SAndroid Build Coastguard Worker    } while (0)
3197*da0073e9SAndroid Build Coastguard Worker 
3198*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
3199*da0073e9SAndroid Build Coastguard Worker                                 arg7,arg8,arg9,arg10,arg11,arg12) \
3200*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3201*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3202*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+12];                       \
3203*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3204*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3205*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3206*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3207*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3208*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3209*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3210*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3211*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3212*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3213*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3214*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3215*da0073e9SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3216*da0073e9SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
3217*da0073e9SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
3218*da0073e9SAndroid Build Coastguard Worker       _argvec[2+12] = (unsigned long)arg12;                       \
3219*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3220*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3221*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3222*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
3223*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3224*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-144\n\t"  /* expand stack frame */            \
3225*da0073e9SAndroid Build Coastguard Worker          /* arg12 */                                              \
3226*da0073e9SAndroid Build Coastguard Worker          "ld  3,96(11)\n\t"                                       \
3227*da0073e9SAndroid Build Coastguard Worker          "std 3,136(1)\n\t"                                       \
3228*da0073e9SAndroid Build Coastguard Worker          /* arg11 */                                              \
3229*da0073e9SAndroid Build Coastguard Worker          "ld  3,88(11)\n\t"                                       \
3230*da0073e9SAndroid Build Coastguard Worker          "std 3,128(1)\n\t"                                       \
3231*da0073e9SAndroid Build Coastguard Worker          /* arg10 */                                              \
3232*da0073e9SAndroid Build Coastguard Worker          "ld  3,80(11)\n\t"                                       \
3233*da0073e9SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
3234*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
3235*da0073e9SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
3236*da0073e9SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
3237*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3238*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3239*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3240*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3241*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
3242*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
3243*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
3244*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
3245*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
3246*da0073e9SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3247*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3248*da0073e9SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3249*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3250*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
3251*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3252*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3253*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3254*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3255*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3256*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3257*da0073e9SAndroid Build Coastguard Worker    } while (0)
3258*da0073e9SAndroid Build Coastguard Worker 
3259*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc64be_linux */
3260*da0073e9SAndroid Build Coastguard Worker 
3261*da0073e9SAndroid Build Coastguard Worker /* ------------------------- ppc64le-linux ----------------------- */
3262*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc64le_linux)
3263*da0073e9SAndroid Build Coastguard Worker 
3264*da0073e9SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
3265*da0073e9SAndroid Build Coastguard Worker 
3266*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
3267*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS                                       \
3268*da0073e9SAndroid Build Coastguard Worker    "lr", "ctr", "xer",                                            \
3269*da0073e9SAndroid Build Coastguard Worker    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
3270*da0073e9SAndroid Build Coastguard Worker    "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",         \
3271*da0073e9SAndroid Build Coastguard Worker    "r11", "r12", "r13"
3272*da0073e9SAndroid Build Coastguard Worker 
3273*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
3274*da0073e9SAndroid Build Coastguard Worker    call and restore it afterwards as gcc may not keep the stack
3275*da0073e9SAndroid Build Coastguard Worker    pointer aligned if it doesn't realise calls are being made
3276*da0073e9SAndroid Build Coastguard Worker    to other functions. */
3277*da0073e9SAndroid Build Coastguard Worker 
3278*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK               \
3279*da0073e9SAndroid Build Coastguard Worker       "mr 28,1\n\t"                        \
3280*da0073e9SAndroid Build Coastguard Worker       "rldicr 1,1,0,59\n\t"
3281*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK             \
3282*da0073e9SAndroid Build Coastguard Worker       "mr 1,28\n\t"
3283*da0073e9SAndroid Build Coastguard Worker 
3284*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
3285*da0073e9SAndroid Build Coastguard Worker    long) == 8. */
3286*da0073e9SAndroid Build Coastguard Worker 
3287*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
3288*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3289*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3290*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+0];                        \
3291*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3292*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3293*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)_orig.r2;                       \
3294*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)_orig.nraddr;                   \
3295*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3296*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3297*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3298*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3299*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3300*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3301*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3302*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3303*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3304*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3305*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3306*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3307*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3308*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3309*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3310*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3311*da0073e9SAndroid Build Coastguard Worker    } while (0)
3312*da0073e9SAndroid Build Coastguard Worker 
3313*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
3314*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3315*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3316*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+1];                        \
3317*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3318*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3319*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3320*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3321*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3322*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3323*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3324*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3325*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3326*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3327*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3328*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3329*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3330*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3331*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3332*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3333*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3334*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3335*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3336*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3337*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3338*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3339*da0073e9SAndroid Build Coastguard Worker    } while (0)
3340*da0073e9SAndroid Build Coastguard Worker 
3341*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
3342*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3343*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3344*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+2];                        \
3345*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3346*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3347*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3348*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3349*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3350*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3351*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3352*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3353*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3354*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3355*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3356*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3357*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3358*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3359*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3360*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3361*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3362*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3363*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3364*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3365*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3366*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3367*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3368*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3369*da0073e9SAndroid Build Coastguard Worker    } while (0)
3370*da0073e9SAndroid Build Coastguard Worker 
3371*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
3372*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3373*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3374*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+3];                        \
3375*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3376*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3377*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3378*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3379*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3380*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3381*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3382*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3383*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3384*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3385*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3386*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3387*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3388*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3389*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3390*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3391*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3392*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3393*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3394*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3395*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3396*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3397*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3398*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3399*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3400*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3401*da0073e9SAndroid Build Coastguard Worker    } while (0)
3402*da0073e9SAndroid Build Coastguard Worker 
3403*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
3404*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3405*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3406*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+4];                        \
3407*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3408*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3409*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3410*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3411*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3412*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3413*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3414*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3415*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3416*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3417*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3418*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3419*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3420*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3421*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3422*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3423*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
3424*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3425*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3426*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3427*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3428*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3429*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3430*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3431*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3432*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3433*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3434*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3435*da0073e9SAndroid Build Coastguard Worker    } while (0)
3436*da0073e9SAndroid Build Coastguard Worker 
3437*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
3438*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3439*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3440*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+5];                        \
3441*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3442*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3443*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3444*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3445*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3446*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3447*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3448*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3449*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3450*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3451*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3452*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3453*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3454*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3455*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3456*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3457*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3458*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
3459*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
3460*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3461*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3462*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3463*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3464*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3465*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3466*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3467*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3468*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3469*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3470*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3471*da0073e9SAndroid Build Coastguard Worker    } while (0)
3472*da0073e9SAndroid Build Coastguard Worker 
3473*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
3474*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3475*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3476*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+6];                        \
3477*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3478*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3479*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3480*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3481*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3482*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3483*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3484*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3485*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3486*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3487*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3488*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3489*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3490*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3491*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3492*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3493*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3494*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3495*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
3496*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
3497*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
3498*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3499*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3500*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3501*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3502*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3503*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3504*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3505*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3506*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3507*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3508*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3509*da0073e9SAndroid Build Coastguard Worker    } while (0)
3510*da0073e9SAndroid Build Coastguard Worker 
3511*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
3512*da0073e9SAndroid Build Coastguard Worker                                  arg7)                            \
3513*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3514*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3515*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+7];                        \
3516*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3517*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3518*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3519*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3520*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3521*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3522*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3523*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3524*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3525*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3526*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3527*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3528*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3529*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3530*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3531*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3532*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3533*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3534*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3535*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
3536*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
3537*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
3538*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
3539*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3540*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3541*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3542*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3543*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3544*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3545*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3546*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3547*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3548*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3549*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3550*da0073e9SAndroid Build Coastguard Worker    } while (0)
3551*da0073e9SAndroid Build Coastguard Worker 
3552*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
3553*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
3554*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3555*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3556*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+8];                        \
3557*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3558*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3559*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3560*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3561*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3562*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3563*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3564*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3565*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3566*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3567*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3568*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3569*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3570*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3571*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3572*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3573*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3574*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3575*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3576*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3577*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
3578*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
3579*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
3580*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
3581*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
3582*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3583*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3584*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3585*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3586*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3587*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3588*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3589*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3590*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3591*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3592*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3593*da0073e9SAndroid Build Coastguard Worker    } while (0)
3594*da0073e9SAndroid Build Coastguard Worker 
3595*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
3596*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
3597*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3598*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3599*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+9];                        \
3600*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3601*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3602*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3603*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3604*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3605*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3606*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3607*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3608*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3609*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3610*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3611*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3612*da0073e9SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3613*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3614*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3615*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3616*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3617*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3618*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-128\n\t"  /* expand stack frame */            \
3619*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
3620*da0073e9SAndroid Build Coastguard Worker          "ld  3,72(12)\n\t"                                       \
3621*da0073e9SAndroid Build Coastguard Worker          "std 3,96(1)\n\t"                                        \
3622*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3623*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3624*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3625*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3626*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
3627*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
3628*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
3629*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
3630*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
3631*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3632*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3633*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3634*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3635*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3636*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3637*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3638*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3639*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3640*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3641*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3642*da0073e9SAndroid Build Coastguard Worker    } while (0)
3643*da0073e9SAndroid Build Coastguard Worker 
3644*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
3645*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
3646*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3647*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3648*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+10];                       \
3649*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3650*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3651*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3652*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3653*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3654*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3655*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3656*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3657*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3658*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3659*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3660*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3661*da0073e9SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3662*da0073e9SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
3663*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3664*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3665*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3666*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3667*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3668*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-128\n\t"  /* expand stack frame */            \
3669*da0073e9SAndroid Build Coastguard Worker          /* arg10 */                                              \
3670*da0073e9SAndroid Build Coastguard Worker          "ld  3,80(12)\n\t"                                       \
3671*da0073e9SAndroid Build Coastguard Worker          "std 3,104(1)\n\t"                                       \
3672*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
3673*da0073e9SAndroid Build Coastguard Worker          "ld  3,72(12)\n\t"                                       \
3674*da0073e9SAndroid Build Coastguard Worker          "std 3,96(1)\n\t"                                        \
3675*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3676*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3677*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3678*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3679*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
3680*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
3681*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
3682*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
3683*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
3684*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3685*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3686*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3687*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3688*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3689*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3690*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3691*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3692*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3693*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3694*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3695*da0073e9SAndroid Build Coastguard Worker    } while (0)
3696*da0073e9SAndroid Build Coastguard Worker 
3697*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
3698*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)     \
3699*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3700*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3701*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+11];                       \
3702*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3703*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3704*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3705*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3706*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3707*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3708*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3709*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3710*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3711*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3712*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3713*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3714*da0073e9SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3715*da0073e9SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
3716*da0073e9SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
3717*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3718*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3719*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3720*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3721*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3722*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-144\n\t"  /* expand stack frame */            \
3723*da0073e9SAndroid Build Coastguard Worker          /* arg11 */                                              \
3724*da0073e9SAndroid Build Coastguard Worker          "ld  3,88(12)\n\t"                                       \
3725*da0073e9SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
3726*da0073e9SAndroid Build Coastguard Worker          /* arg10 */                                              \
3727*da0073e9SAndroid Build Coastguard Worker          "ld  3,80(12)\n\t"                                       \
3728*da0073e9SAndroid Build Coastguard Worker          "std 3,104(1)\n\t"                                       \
3729*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
3730*da0073e9SAndroid Build Coastguard Worker          "ld  3,72(12)\n\t"                                       \
3731*da0073e9SAndroid Build Coastguard Worker          "std 3,96(1)\n\t"                                        \
3732*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3733*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3734*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3735*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3736*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
3737*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
3738*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
3739*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
3740*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
3741*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3742*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3743*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3744*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3745*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3746*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3747*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3748*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3749*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3750*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3751*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3752*da0073e9SAndroid Build Coastguard Worker    } while (0)
3753*da0073e9SAndroid Build Coastguard Worker 
3754*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
3755*da0073e9SAndroid Build Coastguard Worker                                 arg7,arg8,arg9,arg10,arg11,arg12) \
3756*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3757*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3758*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+12];                       \
3759*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3760*da0073e9SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3761*da0073e9SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3762*da0073e9SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3763*da0073e9SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3764*da0073e9SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3765*da0073e9SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3766*da0073e9SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3767*da0073e9SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3768*da0073e9SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3769*da0073e9SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3770*da0073e9SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3771*da0073e9SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3772*da0073e9SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
3773*da0073e9SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
3774*da0073e9SAndroid Build Coastguard Worker       _argvec[2+12] = (unsigned long)arg12;                       \
3775*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3776*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3777*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3778*da0073e9SAndroid Build Coastguard Worker          "std 2,-16(12)\n\t"  /* save tocptr */                   \
3779*da0073e9SAndroid Build Coastguard Worker          "ld   2,-8(12)\n\t"  /* use nraddr's tocptr */           \
3780*da0073e9SAndroid Build Coastguard Worker          "addi 1,1,-144\n\t"  /* expand stack frame */            \
3781*da0073e9SAndroid Build Coastguard Worker          /* arg12 */                                              \
3782*da0073e9SAndroid Build Coastguard Worker          "ld  3,96(12)\n\t"                                       \
3783*da0073e9SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
3784*da0073e9SAndroid Build Coastguard Worker          /* arg11 */                                              \
3785*da0073e9SAndroid Build Coastguard Worker          "ld  3,88(12)\n\t"                                       \
3786*da0073e9SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
3787*da0073e9SAndroid Build Coastguard Worker          /* arg10 */                                              \
3788*da0073e9SAndroid Build Coastguard Worker          "ld  3,80(12)\n\t"                                       \
3789*da0073e9SAndroid Build Coastguard Worker          "std 3,104(1)\n\t"                                       \
3790*da0073e9SAndroid Build Coastguard Worker          /* arg9 */                                               \
3791*da0073e9SAndroid Build Coastguard Worker          "ld  3,72(12)\n\t"                                       \
3792*da0073e9SAndroid Build Coastguard Worker          "std 3,96(1)\n\t"                                        \
3793*da0073e9SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3794*da0073e9SAndroid Build Coastguard Worker          "ld   3, 8(12)\n\t"  /* arg1->r3 */                      \
3795*da0073e9SAndroid Build Coastguard Worker          "ld   4, 16(12)\n\t" /* arg2->r4 */                      \
3796*da0073e9SAndroid Build Coastguard Worker          "ld   5, 24(12)\n\t" /* arg3->r5 */                      \
3797*da0073e9SAndroid Build Coastguard Worker          "ld   6, 32(12)\n\t" /* arg4->r6 */                      \
3798*da0073e9SAndroid Build Coastguard Worker          "ld   7, 40(12)\n\t" /* arg5->r7 */                      \
3799*da0073e9SAndroid Build Coastguard Worker          "ld   8, 48(12)\n\t" /* arg6->r8 */                      \
3800*da0073e9SAndroid Build Coastguard Worker          "ld   9, 56(12)\n\t" /* arg7->r9 */                      \
3801*da0073e9SAndroid Build Coastguard Worker          "ld  10, 64(12)\n\t" /* arg8->r10 */                     \
3802*da0073e9SAndroid Build Coastguard Worker          "ld  12, 0(12)\n\t"  /* target->r12 */                   \
3803*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12                  \
3804*da0073e9SAndroid Build Coastguard Worker          "mr 12,%1\n\t"                                           \
3805*da0073e9SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3806*da0073e9SAndroid Build Coastguard Worker          "ld 2,-16(12)\n\t" /* restore tocptr */                  \
3807*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3808*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3809*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3810*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28"   \
3811*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3812*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3813*da0073e9SAndroid Build Coastguard Worker    } while (0)
3814*da0073e9SAndroid Build Coastguard Worker 
3815*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc64le_linux */
3816*da0073e9SAndroid Build Coastguard Worker 
3817*da0073e9SAndroid Build Coastguard Worker /* ------------------------- arm-linux ------------------------- */
3818*da0073e9SAndroid Build Coastguard Worker 
3819*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_arm_linux)
3820*da0073e9SAndroid Build Coastguard Worker 
3821*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
3822*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4", "r12", "r14"
3823*da0073e9SAndroid Build Coastguard Worker 
3824*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
3825*da0073e9SAndroid Build Coastguard Worker    call and restore it afterwards as gcc may not keep the stack
3826*da0073e9SAndroid Build Coastguard Worker    pointer aligned if it doesn't realise calls are being made
3827*da0073e9SAndroid Build Coastguard Worker    to other functions. */
3828*da0073e9SAndroid Build Coastguard Worker 
3829*da0073e9SAndroid Build Coastguard Worker /* This is a bit tricky.  We store the original stack pointer in r10
3830*da0073e9SAndroid Build Coastguard Worker    as it is callee-saves.  gcc doesn't allow the use of r11 for some
3831*da0073e9SAndroid Build Coastguard Worker    reason.  Also, we can't directly "bic" the stack pointer in thumb
3832*da0073e9SAndroid Build Coastguard Worker    mode since r13 isn't an allowed register number in that context.
3833*da0073e9SAndroid Build Coastguard Worker    So use r4 as a temporary, since that is about to get trashed
3834*da0073e9SAndroid Build Coastguard Worker    anyway, just after each use of this macro.  Side effect is we need
3835*da0073e9SAndroid Build Coastguard Worker    to be very careful about any future changes, since
3836*da0073e9SAndroid Build Coastguard Worker    VALGRIND_ALIGN_STACK simply assumes r4 is usable. */
3837*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK               \
3838*da0073e9SAndroid Build Coastguard Worker       "mov r10, sp\n\t"                    \
3839*da0073e9SAndroid Build Coastguard Worker       "mov r4,  sp\n\t"                    \
3840*da0073e9SAndroid Build Coastguard Worker       "bic r4,  r4, #7\n\t"                \
3841*da0073e9SAndroid Build Coastguard Worker       "mov sp,  r4\n\t"
3842*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK             \
3843*da0073e9SAndroid Build Coastguard Worker       "mov sp,  r10\n\t"
3844*da0073e9SAndroid Build Coastguard Worker 
3845*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned
3846*da0073e9SAndroid Build Coastguard Worker    long) == 4. */
3847*da0073e9SAndroid Build Coastguard Worker 
3848*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
3849*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3850*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3851*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
3852*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3853*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
3854*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3855*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3856*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
3857*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
3858*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3859*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0\n"                                           \
3860*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3861*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
3862*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
3863*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3864*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3865*da0073e9SAndroid Build Coastguard Worker    } while (0)
3866*da0073e9SAndroid Build Coastguard Worker 
3867*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
3868*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3869*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3870*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                          \
3871*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3872*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
3873*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
3874*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3875*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3876*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
3877*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
3878*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
3879*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3880*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0\n"                                           \
3881*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3882*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
3883*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
3884*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3885*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3886*da0073e9SAndroid Build Coastguard Worker    } while (0)
3887*da0073e9SAndroid Build Coastguard Worker 
3888*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
3889*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3890*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3891*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
3892*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3893*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
3894*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
3895*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
3896*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3897*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3898*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
3899*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
3900*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
3901*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
3902*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3903*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0\n"                                           \
3904*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3905*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
3906*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
3907*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3908*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3909*da0073e9SAndroid Build Coastguard Worker    } while (0)
3910*da0073e9SAndroid Build Coastguard Worker 
3911*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
3912*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3913*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3914*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
3915*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3916*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
3917*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
3918*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
3919*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
3920*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3921*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3922*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
3923*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
3924*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
3925*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
3926*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
3927*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3928*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0\n"                                           \
3929*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3930*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
3931*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
3932*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3933*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3934*da0073e9SAndroid Build Coastguard Worker    } while (0)
3935*da0073e9SAndroid Build Coastguard Worker 
3936*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
3937*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3938*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3939*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
3940*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3941*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
3942*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
3943*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
3944*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
3945*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
3946*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3947*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3948*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
3949*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
3950*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
3951*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
3952*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
3953*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
3954*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3955*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
3956*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3957*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
3958*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
3959*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3960*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3961*da0073e9SAndroid Build Coastguard Worker    } while (0)
3962*da0073e9SAndroid Build Coastguard Worker 
3963*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
3964*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3965*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3966*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
3967*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3968*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
3969*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
3970*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
3971*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
3972*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
3973*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
3974*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3975*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
3976*da0073e9SAndroid Build Coastguard Worker          "sub sp, sp, #4 \n\t"                                    \
3977*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
3978*da0073e9SAndroid Build Coastguard Worker          "push {r0} \n\t"                                         \
3979*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
3980*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
3981*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
3982*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
3983*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
3984*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
3985*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
3986*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
3987*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3988*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
3989*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
3990*da0073e9SAndroid Build Coastguard Worker       );                                                          \
3991*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3992*da0073e9SAndroid Build Coastguard Worker    } while (0)
3993*da0073e9SAndroid Build Coastguard Worker 
3994*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
3995*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
3996*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3997*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
3998*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3999*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4000*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4001*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4002*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4003*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4004*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4005*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4006*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4007*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4008*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
4009*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
4010*da0073e9SAndroid Build Coastguard Worker          "push {r0, r1} \n\t"                                     \
4011*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
4012*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
4013*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
4014*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
4015*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
4016*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
4017*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4018*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
4019*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4020*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4021*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
4022*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4023*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4024*da0073e9SAndroid Build Coastguard Worker    } while (0)
4025*da0073e9SAndroid Build Coastguard Worker 
4026*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
4027*da0073e9SAndroid Build Coastguard Worker                                  arg7)                            \
4028*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4029*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4030*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
4031*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4032*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4033*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4034*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4035*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4036*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4037*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4038*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4039*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4040*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4041*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4042*da0073e9SAndroid Build Coastguard Worker          "sub sp, sp, #4 \n\t"                                    \
4043*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
4044*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
4045*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
4046*da0073e9SAndroid Build Coastguard Worker          "push {r0, r1, r2} \n\t"                                 \
4047*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
4048*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
4049*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
4050*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
4051*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
4052*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
4053*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4054*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
4055*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4056*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4057*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
4058*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4059*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4060*da0073e9SAndroid Build Coastguard Worker    } while (0)
4061*da0073e9SAndroid Build Coastguard Worker 
4062*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
4063*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
4064*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4065*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4066*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
4067*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4068*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4069*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4070*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4071*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4072*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4073*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4074*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4075*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4076*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4077*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4078*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4079*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
4080*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
4081*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
4082*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
4083*da0073e9SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3} \n\t"                             \
4084*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
4085*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
4086*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
4087*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
4088*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
4089*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
4090*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4091*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
4092*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4093*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4094*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
4095*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4096*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4097*da0073e9SAndroid Build Coastguard Worker    } while (0)
4098*da0073e9SAndroid Build Coastguard Worker 
4099*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
4100*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
4101*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4102*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4103*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
4104*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4105*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4106*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4107*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4108*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4109*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4110*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4111*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4112*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4113*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4114*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
4115*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4116*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4117*da0073e9SAndroid Build Coastguard Worker          "sub sp, sp, #4 \n\t"                                    \
4118*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
4119*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
4120*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
4121*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
4122*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1, #36] \n\t"                                 \
4123*da0073e9SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3, r4} \n\t"                         \
4124*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
4125*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
4126*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
4127*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
4128*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
4129*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
4130*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4131*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
4132*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4133*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4134*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
4135*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4136*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4137*da0073e9SAndroid Build Coastguard Worker    } while (0)
4138*da0073e9SAndroid Build Coastguard Worker 
4139*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
4140*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
4141*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4142*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4143*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
4144*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4145*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4146*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4147*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4148*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4149*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4150*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4151*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4152*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4153*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4154*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
4155*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
4156*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4157*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4158*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #40] \n\t"                                 \
4159*da0073e9SAndroid Build Coastguard Worker          "push {r0} \n\t"                                         \
4160*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
4161*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
4162*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
4163*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
4164*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1, #36] \n\t"                                 \
4165*da0073e9SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3, r4} \n\t"                         \
4166*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
4167*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
4168*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
4169*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
4170*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
4171*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
4172*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4173*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
4174*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4175*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4176*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
4177*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4178*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4179*da0073e9SAndroid Build Coastguard Worker    } while (0)
4180*da0073e9SAndroid Build Coastguard Worker 
4181*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
4182*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
4183*da0073e9SAndroid Build Coastguard Worker                                   arg11)                          \
4184*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4185*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4186*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
4187*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4188*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4189*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4190*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4191*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4192*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4193*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4194*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4195*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4196*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4197*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
4198*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
4199*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
4200*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4201*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4202*da0073e9SAndroid Build Coastguard Worker          "sub sp, sp, #4 \n\t"                                    \
4203*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #40] \n\t"                                 \
4204*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #44] \n\t"                                 \
4205*da0073e9SAndroid Build Coastguard Worker          "push {r0, r1} \n\t"                                     \
4206*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
4207*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
4208*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
4209*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
4210*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1, #36] \n\t"                                 \
4211*da0073e9SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3, r4} \n\t"                         \
4212*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
4213*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
4214*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
4215*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
4216*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
4217*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
4218*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4219*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
4220*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4221*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4222*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
4223*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4224*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4225*da0073e9SAndroid Build Coastguard Worker    } while (0)
4226*da0073e9SAndroid Build Coastguard Worker 
4227*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
4228*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
4229*da0073e9SAndroid Build Coastguard Worker                                   arg11,arg12)                    \
4230*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4231*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4232*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
4233*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4234*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4235*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4236*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4237*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4238*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4239*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4240*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4241*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4242*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4243*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
4244*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
4245*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
4246*da0073e9SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)(arg12);                       \
4247*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4248*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4249*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #40] \n\t"                                 \
4250*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #44] \n\t"                                 \
4251*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #48] \n\t"                                 \
4252*da0073e9SAndroid Build Coastguard Worker          "push {r0, r1, r2} \n\t"                                 \
4253*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
4254*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
4255*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
4256*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
4257*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1, #36] \n\t"                                 \
4258*da0073e9SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3, r4} \n\t"                         \
4259*da0073e9SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
4260*da0073e9SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
4261*da0073e9SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
4262*da0073e9SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
4263*da0073e9SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
4264*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
4265*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4266*da0073e9SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
4267*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4268*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4269*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10"   \
4270*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4271*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4272*da0073e9SAndroid Build Coastguard Worker    } while (0)
4273*da0073e9SAndroid Build Coastguard Worker 
4274*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_arm_linux */
4275*da0073e9SAndroid Build Coastguard Worker 
4276*da0073e9SAndroid Build Coastguard Worker /* ------------------------ arm64-linux ------------------------ */
4277*da0073e9SAndroid Build Coastguard Worker 
4278*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_arm64_linux)
4279*da0073e9SAndroid Build Coastguard Worker 
4280*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
4281*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS \
4282*da0073e9SAndroid Build Coastguard Worker      "x0", "x1", "x2", "x3","x4", "x5", "x6", "x7", "x8", "x9",   \
4283*da0073e9SAndroid Build Coastguard Worker      "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17",      \
4284*da0073e9SAndroid Build Coastguard Worker      "x18", "x19", "x20", "x30",                                  \
4285*da0073e9SAndroid Build Coastguard Worker      "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9",  \
4286*da0073e9SAndroid Build Coastguard Worker      "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17",      \
4287*da0073e9SAndroid Build Coastguard Worker      "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25",      \
4288*da0073e9SAndroid Build Coastguard Worker      "v26", "v27", "v28", "v29", "v30", "v31"
4289*da0073e9SAndroid Build Coastguard Worker 
4290*da0073e9SAndroid Build Coastguard Worker /* x21 is callee-saved, so we can use it to save and restore SP around
4291*da0073e9SAndroid Build Coastguard Worker    the hidden call. */
4292*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK               \
4293*da0073e9SAndroid Build Coastguard Worker       "mov x21, sp\n\t"                    \
4294*da0073e9SAndroid Build Coastguard Worker       "bic sp, x21, #15\n\t"
4295*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK             \
4296*da0073e9SAndroid Build Coastguard Worker       "mov sp,  x21\n\t"
4297*da0073e9SAndroid Build Coastguard Worker 
4298*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on arm64-linux,
4299*da0073e9SAndroid Build Coastguard Worker    sizeof(unsigned long) == 8. */
4300*da0073e9SAndroid Build Coastguard Worker 
4301*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
4302*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4303*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4304*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
4305*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4306*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4307*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4308*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4309*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4310*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4311*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4312*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0\n"                                           \
4313*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4314*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4315*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4316*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4317*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4318*da0073e9SAndroid Build Coastguard Worker    } while (0)
4319*da0073e9SAndroid Build Coastguard Worker 
4320*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
4321*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4322*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4323*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                          \
4324*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4325*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4326*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4327*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4328*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4329*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4330*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4331*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4332*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4333*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0\n"                                           \
4334*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4335*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4336*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4337*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4338*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4339*da0073e9SAndroid Build Coastguard Worker    } while (0)
4340*da0073e9SAndroid Build Coastguard Worker 
4341*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
4342*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4343*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4344*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
4345*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4346*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4347*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4348*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4349*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4350*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4351*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4352*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4353*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4354*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4355*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4356*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0\n"                                           \
4357*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4358*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4359*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4360*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4361*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4362*da0073e9SAndroid Build Coastguard Worker    } while (0)
4363*da0073e9SAndroid Build Coastguard Worker 
4364*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
4365*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4366*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4367*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
4368*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4369*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4370*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4371*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4372*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4373*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4374*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4375*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4376*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4377*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4378*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4379*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4380*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4381*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0\n"                                           \
4382*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4383*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4384*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4385*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4386*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4387*da0073e9SAndroid Build Coastguard Worker    } while (0)
4388*da0073e9SAndroid Build Coastguard Worker 
4389*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
4390*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4391*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4392*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
4393*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4394*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4395*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4396*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4397*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4398*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4399*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4400*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4401*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4402*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4403*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4404*da0073e9SAndroid Build Coastguard Worker          "ldr x3, [%1, #32] \n\t"                                 \
4405*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4406*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4407*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4408*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0"                                             \
4409*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4410*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4411*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4412*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4413*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4414*da0073e9SAndroid Build Coastguard Worker    } while (0)
4415*da0073e9SAndroid Build Coastguard Worker 
4416*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
4417*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4418*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4419*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
4420*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4421*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4422*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4423*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4424*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4425*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4426*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4427*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4428*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4429*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4430*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4431*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4432*da0073e9SAndroid Build Coastguard Worker          "ldr x3, [%1, #32] \n\t"                                 \
4433*da0073e9SAndroid Build Coastguard Worker          "ldr x4, [%1, #40] \n\t"                                 \
4434*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4435*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4436*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4437*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0"                                             \
4438*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4439*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4440*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4441*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4442*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4443*da0073e9SAndroid Build Coastguard Worker    } while (0)
4444*da0073e9SAndroid Build Coastguard Worker 
4445*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
4446*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4447*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4448*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
4449*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4450*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4451*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4452*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4453*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4454*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4455*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4456*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4457*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4458*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4459*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4460*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4461*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4462*da0073e9SAndroid Build Coastguard Worker          "ldr x3, [%1, #32] \n\t"                                 \
4463*da0073e9SAndroid Build Coastguard Worker          "ldr x4, [%1, #40] \n\t"                                 \
4464*da0073e9SAndroid Build Coastguard Worker          "ldr x5, [%1, #48] \n\t"                                 \
4465*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4466*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4467*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4468*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0"                                             \
4469*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4470*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4471*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4472*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4473*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4474*da0073e9SAndroid Build Coastguard Worker    } while (0)
4475*da0073e9SAndroid Build Coastguard Worker 
4476*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
4477*da0073e9SAndroid Build Coastguard Worker                                  arg7)                            \
4478*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4479*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4480*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
4481*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4482*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4483*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4484*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4485*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4486*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4487*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4488*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4489*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4490*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4491*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4492*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4493*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4494*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4495*da0073e9SAndroid Build Coastguard Worker          "ldr x3, [%1, #32] \n\t"                                 \
4496*da0073e9SAndroid Build Coastguard Worker          "ldr x4, [%1, #40] \n\t"                                 \
4497*da0073e9SAndroid Build Coastguard Worker          "ldr x5, [%1, #48] \n\t"                                 \
4498*da0073e9SAndroid Build Coastguard Worker          "ldr x6, [%1, #56] \n\t"                                 \
4499*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4500*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4501*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4502*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0"                                             \
4503*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4504*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4505*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4506*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4507*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4508*da0073e9SAndroid Build Coastguard Worker    } while (0)
4509*da0073e9SAndroid Build Coastguard Worker 
4510*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
4511*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
4512*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4513*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4514*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
4515*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4516*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4517*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4518*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4519*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4520*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4521*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4522*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4523*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4524*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4525*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4526*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4527*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4528*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4529*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4530*da0073e9SAndroid Build Coastguard Worker          "ldr x3, [%1, #32] \n\t"                                 \
4531*da0073e9SAndroid Build Coastguard Worker          "ldr x4, [%1, #40] \n\t"                                 \
4532*da0073e9SAndroid Build Coastguard Worker          "ldr x5, [%1, #48] \n\t"                                 \
4533*da0073e9SAndroid Build Coastguard Worker          "ldr x6, [%1, #56] \n\t"                                 \
4534*da0073e9SAndroid Build Coastguard Worker          "ldr x7, [%1, #64] \n\t"                                 \
4535*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4536*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4537*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4538*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0"                                             \
4539*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4540*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4541*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4542*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4543*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4544*da0073e9SAndroid Build Coastguard Worker    } while (0)
4545*da0073e9SAndroid Build Coastguard Worker 
4546*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
4547*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
4548*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4549*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4550*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
4551*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4552*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4553*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4554*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4555*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4556*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4557*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4558*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4559*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4560*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4561*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
4562*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4563*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4564*da0073e9SAndroid Build Coastguard Worker          "sub sp, sp, #0x20 \n\t"                                 \
4565*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4566*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4567*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4568*da0073e9SAndroid Build Coastguard Worker          "ldr x3, [%1, #32] \n\t"                                 \
4569*da0073e9SAndroid Build Coastguard Worker          "ldr x4, [%1, #40] \n\t"                                 \
4570*da0073e9SAndroid Build Coastguard Worker          "ldr x5, [%1, #48] \n\t"                                 \
4571*da0073e9SAndroid Build Coastguard Worker          "ldr x6, [%1, #56] \n\t"                                 \
4572*da0073e9SAndroid Build Coastguard Worker          "ldr x7, [%1, #64] \n\t"                                 \
4573*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #72] \n\t"                                 \
4574*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #0]  \n\t"                                 \
4575*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4576*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4577*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4578*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0"                                             \
4579*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4580*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4581*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4582*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4583*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4584*da0073e9SAndroid Build Coastguard Worker    } while (0)
4585*da0073e9SAndroid Build Coastguard Worker 
4586*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
4587*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
4588*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4589*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4590*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
4591*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4592*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4593*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4594*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4595*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4596*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4597*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4598*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4599*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4600*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4601*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
4602*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
4603*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4604*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4605*da0073e9SAndroid Build Coastguard Worker          "sub sp, sp, #0x20 \n\t"                                 \
4606*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4607*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4608*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4609*da0073e9SAndroid Build Coastguard Worker          "ldr x3, [%1, #32] \n\t"                                 \
4610*da0073e9SAndroid Build Coastguard Worker          "ldr x4, [%1, #40] \n\t"                                 \
4611*da0073e9SAndroid Build Coastguard Worker          "ldr x5, [%1, #48] \n\t"                                 \
4612*da0073e9SAndroid Build Coastguard Worker          "ldr x6, [%1, #56] \n\t"                                 \
4613*da0073e9SAndroid Build Coastguard Worker          "ldr x7, [%1, #64] \n\t"                                 \
4614*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #72] \n\t"                                 \
4615*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #0]  \n\t"                                 \
4616*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #80] \n\t"                                 \
4617*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #8]  \n\t"                                 \
4618*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4619*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4620*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4621*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0"                                             \
4622*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4623*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4624*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4625*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4626*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4627*da0073e9SAndroid Build Coastguard Worker    } while (0)
4628*da0073e9SAndroid Build Coastguard Worker 
4629*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
4630*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)     \
4631*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4632*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4633*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
4634*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4635*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4636*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4637*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4638*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4639*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4640*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4641*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4642*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4643*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4644*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
4645*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
4646*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
4647*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4648*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4649*da0073e9SAndroid Build Coastguard Worker          "sub sp, sp, #0x30 \n\t"                                 \
4650*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4651*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4652*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4653*da0073e9SAndroid Build Coastguard Worker          "ldr x3, [%1, #32] \n\t"                                 \
4654*da0073e9SAndroid Build Coastguard Worker          "ldr x4, [%1, #40] \n\t"                                 \
4655*da0073e9SAndroid Build Coastguard Worker          "ldr x5, [%1, #48] \n\t"                                 \
4656*da0073e9SAndroid Build Coastguard Worker          "ldr x6, [%1, #56] \n\t"                                 \
4657*da0073e9SAndroid Build Coastguard Worker          "ldr x7, [%1, #64] \n\t"                                 \
4658*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #72] \n\t"                                 \
4659*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #0]  \n\t"                                 \
4660*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #80] \n\t"                                 \
4661*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #8]  \n\t"                                 \
4662*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #88] \n\t"                                 \
4663*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #16] \n\t"                                 \
4664*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4665*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4666*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4667*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0"                                             \
4668*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4669*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4670*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4671*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4672*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4673*da0073e9SAndroid Build Coastguard Worker    } while (0)
4674*da0073e9SAndroid Build Coastguard Worker 
4675*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
4676*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11,     \
4677*da0073e9SAndroid Build Coastguard Worker                                   arg12)                          \
4678*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
4679*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4680*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
4681*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4682*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
4683*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
4684*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
4685*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
4686*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
4687*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
4688*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
4689*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
4690*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
4691*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
4692*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
4693*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
4694*da0073e9SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)(arg12);                       \
4695*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4696*da0073e9SAndroid Build Coastguard Worker          VALGRIND_ALIGN_STACK                                     \
4697*da0073e9SAndroid Build Coastguard Worker          "sub sp, sp, #0x30 \n\t"                                 \
4698*da0073e9SAndroid Build Coastguard Worker          "ldr x0, [%1, #8] \n\t"                                  \
4699*da0073e9SAndroid Build Coastguard Worker          "ldr x1, [%1, #16] \n\t"                                 \
4700*da0073e9SAndroid Build Coastguard Worker          "ldr x2, [%1, #24] \n\t"                                 \
4701*da0073e9SAndroid Build Coastguard Worker          "ldr x3, [%1, #32] \n\t"                                 \
4702*da0073e9SAndroid Build Coastguard Worker          "ldr x4, [%1, #40] \n\t"                                 \
4703*da0073e9SAndroid Build Coastguard Worker          "ldr x5, [%1, #48] \n\t"                                 \
4704*da0073e9SAndroid Build Coastguard Worker          "ldr x6, [%1, #56] \n\t"                                 \
4705*da0073e9SAndroid Build Coastguard Worker          "ldr x7, [%1, #64] \n\t"                                 \
4706*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #72] \n\t"                                 \
4707*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #0]  \n\t"                                 \
4708*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #80] \n\t"                                 \
4709*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #8]  \n\t"                                 \
4710*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #88] \n\t"                                 \
4711*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #16] \n\t"                                 \
4712*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1, #96] \n\t"                                 \
4713*da0073e9SAndroid Build Coastguard Worker          "str x8, [sp, #24] \n\t"                                 \
4714*da0073e9SAndroid Build Coastguard Worker          "ldr x8, [%1] \n\t"  /* target->x8 */                    \
4715*da0073e9SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8                   \
4716*da0073e9SAndroid Build Coastguard Worker          VALGRIND_RESTORE_STACK                                   \
4717*da0073e9SAndroid Build Coastguard Worker          "mov %0, x0"                                             \
4718*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4719*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
4720*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21"   \
4721*da0073e9SAndroid Build Coastguard Worker       );                                                          \
4722*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4723*da0073e9SAndroid Build Coastguard Worker    } while (0)
4724*da0073e9SAndroid Build Coastguard Worker 
4725*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_arm64_linux */
4726*da0073e9SAndroid Build Coastguard Worker 
4727*da0073e9SAndroid Build Coastguard Worker /* ------------------------- s390x-linux ------------------------- */
4728*da0073e9SAndroid Build Coastguard Worker 
4729*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_s390x_linux)
4730*da0073e9SAndroid Build Coastguard Worker 
4731*da0073e9SAndroid Build Coastguard Worker /* Similar workaround as amd64 (see above), but we use r11 as frame
4732*da0073e9SAndroid Build Coastguard Worker    pointer and save the old r11 in r7. r11 might be used for
4733*da0073e9SAndroid Build Coastguard Worker    argvec, therefore we copy argvec in r1 since r1 is clobbered
4734*da0073e9SAndroid Build Coastguard Worker    after the call anyway.  */
4735*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
4736*da0073e9SAndroid Build Coastguard Worker #  define __FRAME_POINTER                                         \
4737*da0073e9SAndroid Build Coastguard Worker       ,"d"(__builtin_dwarf_cfa())
4738*da0073e9SAndroid Build Coastguard Worker #  define VALGRIND_CFI_PROLOGUE                                   \
4739*da0073e9SAndroid Build Coastguard Worker       ".cfi_remember_state\n\t"                                   \
4740*da0073e9SAndroid Build Coastguard Worker       "lgr 1,%1\n\t" /* copy the argvec pointer in r1 */          \
4741*da0073e9SAndroid Build Coastguard Worker       "lgr 7,11\n\t"                                              \
4742*da0073e9SAndroid Build Coastguard Worker       "lgr 11,%2\n\t"                                             \
4743*da0073e9SAndroid Build Coastguard Worker       ".cfi_def_cfa r11, 0\n\t"
4744*da0073e9SAndroid Build Coastguard Worker #  define VALGRIND_CFI_EPILOGUE                                   \
4745*da0073e9SAndroid Build Coastguard Worker       "lgr 11, 7\n\t"                                             \
4746*da0073e9SAndroid Build Coastguard Worker       ".cfi_restore_state\n\t"
4747*da0073e9SAndroid Build Coastguard Worker #else
4748*da0073e9SAndroid Build Coastguard Worker #  define __FRAME_POINTER
4749*da0073e9SAndroid Build Coastguard Worker #  define VALGRIND_CFI_PROLOGUE                                   \
4750*da0073e9SAndroid Build Coastguard Worker       "lgr 1,%1\n\t"
4751*da0073e9SAndroid Build Coastguard Worker #  define VALGRIND_CFI_EPILOGUE
4752*da0073e9SAndroid Build Coastguard Worker #endif
4753*da0073e9SAndroid Build Coastguard Worker 
4754*da0073e9SAndroid Build Coastguard Worker /* Nb: On s390 the stack pointer is properly aligned *at all times*
4755*da0073e9SAndroid Build Coastguard Worker    according to the s390 GCC maintainer. (The ABI specification is not
4756*da0073e9SAndroid Build Coastguard Worker    precise in this regard.) Therefore, VALGRIND_ALIGN_STACK and
4757*da0073e9SAndroid Build Coastguard Worker    VALGRIND_RESTORE_STACK are not defined here. */
4758*da0073e9SAndroid Build Coastguard Worker 
4759*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. Note that we overwrite
4760*da0073e9SAndroid Build Coastguard Worker    r14 in s390_irgen_noredir (VEX/priv/guest_s390_irgen.c) to give the
4761*da0073e9SAndroid Build Coastguard Worker    function a proper return address. All others are ABI defined call
4762*da0073e9SAndroid Build Coastguard Worker    clobbers. */
4763*da0073e9SAndroid Build Coastguard Worker #if defined(__VX__) || defined(__S390_VX__)
4764*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "0", "1", "2", "3", "4", "5", "14",   \
4765*da0073e9SAndroid Build Coastguard Worker       "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",             \
4766*da0073e9SAndroid Build Coastguard Worker       "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",       \
4767*da0073e9SAndroid Build Coastguard Worker       "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",     \
4768*da0073e9SAndroid Build Coastguard Worker       "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4769*da0073e9SAndroid Build Coastguard Worker #else
4770*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "0", "1", "2", "3", "4", "5", "14",   \
4771*da0073e9SAndroid Build Coastguard Worker       "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7"
4772*da0073e9SAndroid Build Coastguard Worker #endif
4773*da0073e9SAndroid Build Coastguard Worker 
4774*da0073e9SAndroid Build Coastguard Worker /* Nb: Although r11 is modified in the asm snippets below (inside
4775*da0073e9SAndroid Build Coastguard Worker    VALGRIND_CFI_PROLOGUE) it is not listed in the clobber section, for
4776*da0073e9SAndroid Build Coastguard Worker    two reasons:
4777*da0073e9SAndroid Build Coastguard Worker    (1) r11 is restored in VALGRIND_CFI_EPILOGUE, so effectively it is not
4778*da0073e9SAndroid Build Coastguard Worker        modified
4779*da0073e9SAndroid Build Coastguard Worker    (2) GCC will complain that r11 cannot appear inside a clobber section,
4780*da0073e9SAndroid Build Coastguard Worker        when compiled with -O -fno-omit-frame-pointer
4781*da0073e9SAndroid Build Coastguard Worker  */
4782*da0073e9SAndroid Build Coastguard Worker 
4783*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                  \
4784*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
4785*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
4786*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long  _argvec[1];                        \
4787*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
4788*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
4789*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
4790*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
4791*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-160\n\t"                                      \
4792*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"  /* target->r1 */                      \
4793*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
4794*da0073e9SAndroid Build Coastguard Worker          "aghi 15,160\n\t"                                       \
4795*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
4796*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
4797*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
4798*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "d" (&_argvec[0]) __FRAME_POINTER           \
4799*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
4800*da0073e9SAndroid Build Coastguard Worker       );                                                         \
4801*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
4802*da0073e9SAndroid Build Coastguard Worker    } while (0)
4803*da0073e9SAndroid Build Coastguard Worker 
4804*da0073e9SAndroid Build Coastguard Worker /* The call abi has the arguments in r2-r6 and stack */
4805*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                            \
4806*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
4807*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
4808*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                         \
4809*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
4810*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
4811*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
4812*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
4813*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
4814*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-160\n\t"                                      \
4815*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
4816*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
4817*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
4818*da0073e9SAndroid Build Coastguard Worker          "aghi 15,160\n\t"                                       \
4819*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
4820*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
4821*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
4822*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
4823*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
4824*da0073e9SAndroid Build Coastguard Worker       );                                                         \
4825*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
4826*da0073e9SAndroid Build Coastguard Worker    } while (0)
4827*da0073e9SAndroid Build Coastguard Worker 
4828*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1, arg2)                     \
4829*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
4830*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
4831*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                         \
4832*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
4833*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
4834*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
4835*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
4836*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
4837*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
4838*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-160\n\t"                                      \
4839*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
4840*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
4841*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
4842*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
4843*da0073e9SAndroid Build Coastguard Worker          "aghi 15,160\n\t"                                       \
4844*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
4845*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
4846*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
4847*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
4848*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
4849*da0073e9SAndroid Build Coastguard Worker       );                                                         \
4850*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
4851*da0073e9SAndroid Build Coastguard Worker    } while (0)
4852*da0073e9SAndroid Build Coastguard Worker 
4853*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3)              \
4854*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
4855*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
4856*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                         \
4857*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
4858*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
4859*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
4860*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
4861*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
4862*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
4863*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
4864*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-160\n\t"                                      \
4865*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
4866*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
4867*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
4868*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
4869*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
4870*da0073e9SAndroid Build Coastguard Worker          "aghi 15,160\n\t"                                       \
4871*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
4872*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
4873*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
4874*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
4875*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
4876*da0073e9SAndroid Build Coastguard Worker       );                                                         \
4877*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
4878*da0073e9SAndroid Build Coastguard Worker    } while (0)
4879*da0073e9SAndroid Build Coastguard Worker 
4880*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4)       \
4881*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
4882*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
4883*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                         \
4884*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
4885*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
4886*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
4887*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
4888*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
4889*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                          \
4890*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
4891*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
4892*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-160\n\t"                                      \
4893*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
4894*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
4895*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
4896*da0073e9SAndroid Build Coastguard Worker          "lg 5,32(1)\n\t"                                        \
4897*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
4898*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
4899*da0073e9SAndroid Build Coastguard Worker          "aghi 15,160\n\t"                                       \
4900*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
4901*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
4902*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
4903*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
4904*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
4905*da0073e9SAndroid Build Coastguard Worker       );                                                         \
4906*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
4907*da0073e9SAndroid Build Coastguard Worker    } while (0)
4908*da0073e9SAndroid Build Coastguard Worker 
4909*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5)   \
4910*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
4911*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
4912*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                         \
4913*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
4914*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
4915*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
4916*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
4917*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
4918*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                          \
4919*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                          \
4920*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
4921*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
4922*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-160\n\t"                                      \
4923*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
4924*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
4925*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
4926*da0073e9SAndroid Build Coastguard Worker          "lg 5,32(1)\n\t"                                        \
4927*da0073e9SAndroid Build Coastguard Worker          "lg 6,40(1)\n\t"                                        \
4928*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
4929*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
4930*da0073e9SAndroid Build Coastguard Worker          "aghi 15,160\n\t"                                       \
4931*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
4932*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
4933*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
4934*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
4935*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
4936*da0073e9SAndroid Build Coastguard Worker       );                                                         \
4937*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
4938*da0073e9SAndroid Build Coastguard Worker    } while (0)
4939*da0073e9SAndroid Build Coastguard Worker 
4940*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
4941*da0073e9SAndroid Build Coastguard Worker                      arg6)                                       \
4942*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
4943*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
4944*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                         \
4945*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
4946*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
4947*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
4948*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
4949*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
4950*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                          \
4951*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                          \
4952*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                          \
4953*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
4954*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
4955*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-168\n\t"                                      \
4956*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
4957*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
4958*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
4959*da0073e9SAndroid Build Coastguard Worker          "lg 5,32(1)\n\t"                                        \
4960*da0073e9SAndroid Build Coastguard Worker          "lg 6,40(1)\n\t"                                        \
4961*da0073e9SAndroid Build Coastguard Worker          "mvc 160(8,15), 48(1)\n\t"                              \
4962*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
4963*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
4964*da0073e9SAndroid Build Coastguard Worker          "aghi 15,168\n\t"                                       \
4965*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
4966*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
4967*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
4968*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
4969*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
4970*da0073e9SAndroid Build Coastguard Worker       );                                                         \
4971*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
4972*da0073e9SAndroid Build Coastguard Worker    } while (0)
4973*da0073e9SAndroid Build Coastguard Worker 
4974*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
4975*da0073e9SAndroid Build Coastguard Worker                      arg6, arg7)                                 \
4976*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
4977*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
4978*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                         \
4979*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
4980*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
4981*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
4982*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
4983*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
4984*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                          \
4985*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                          \
4986*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                          \
4987*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                          \
4988*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
4989*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
4990*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-176\n\t"                                      \
4991*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
4992*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
4993*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
4994*da0073e9SAndroid Build Coastguard Worker          "lg 5,32(1)\n\t"                                        \
4995*da0073e9SAndroid Build Coastguard Worker          "lg 6,40(1)\n\t"                                        \
4996*da0073e9SAndroid Build Coastguard Worker          "mvc 160(8,15), 48(1)\n\t"                              \
4997*da0073e9SAndroid Build Coastguard Worker          "mvc 168(8,15), 56(1)\n\t"                              \
4998*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
4999*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
5000*da0073e9SAndroid Build Coastguard Worker          "aghi 15,176\n\t"                                       \
5001*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
5002*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
5003*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
5004*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
5005*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5006*da0073e9SAndroid Build Coastguard Worker       );                                                         \
5007*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
5008*da0073e9SAndroid Build Coastguard Worker    } while (0)
5009*da0073e9SAndroid Build Coastguard Worker 
5010*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
5011*da0073e9SAndroid Build Coastguard Worker                      arg6, arg7 ,arg8)                           \
5012*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
5013*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
5014*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                         \
5015*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
5016*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
5017*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
5018*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
5019*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
5020*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                          \
5021*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                          \
5022*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                          \
5023*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                          \
5024*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                          \
5025*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
5026*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
5027*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-184\n\t"                                      \
5028*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
5029*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
5030*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
5031*da0073e9SAndroid Build Coastguard Worker          "lg 5,32(1)\n\t"                                        \
5032*da0073e9SAndroid Build Coastguard Worker          "lg 6,40(1)\n\t"                                        \
5033*da0073e9SAndroid Build Coastguard Worker          "mvc 160(8,15), 48(1)\n\t"                              \
5034*da0073e9SAndroid Build Coastguard Worker          "mvc 168(8,15), 56(1)\n\t"                              \
5035*da0073e9SAndroid Build Coastguard Worker          "mvc 176(8,15), 64(1)\n\t"                              \
5036*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
5037*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
5038*da0073e9SAndroid Build Coastguard Worker          "aghi 15,184\n\t"                                       \
5039*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
5040*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
5041*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
5042*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
5043*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5044*da0073e9SAndroid Build Coastguard Worker       );                                                         \
5045*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
5046*da0073e9SAndroid Build Coastguard Worker    } while (0)
5047*da0073e9SAndroid Build Coastguard Worker 
5048*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5,   \
5049*da0073e9SAndroid Build Coastguard Worker                      arg6, arg7 ,arg8, arg9)                     \
5050*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
5051*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
5052*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                        \
5053*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
5054*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
5055*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
5056*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
5057*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
5058*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                          \
5059*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                          \
5060*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                          \
5061*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                          \
5062*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                          \
5063*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                          \
5064*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
5065*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
5066*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-192\n\t"                                      \
5067*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
5068*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
5069*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
5070*da0073e9SAndroid Build Coastguard Worker          "lg 5,32(1)\n\t"                                        \
5071*da0073e9SAndroid Build Coastguard Worker          "lg 6,40(1)\n\t"                                        \
5072*da0073e9SAndroid Build Coastguard Worker          "mvc 160(8,15), 48(1)\n\t"                              \
5073*da0073e9SAndroid Build Coastguard Worker          "mvc 168(8,15), 56(1)\n\t"                              \
5074*da0073e9SAndroid Build Coastguard Worker          "mvc 176(8,15), 64(1)\n\t"                              \
5075*da0073e9SAndroid Build Coastguard Worker          "mvc 184(8,15), 72(1)\n\t"                              \
5076*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
5077*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
5078*da0073e9SAndroid Build Coastguard Worker          "aghi 15,192\n\t"                                       \
5079*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
5080*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
5081*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
5082*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
5083*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5084*da0073e9SAndroid Build Coastguard Worker       );                                                         \
5085*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
5086*da0073e9SAndroid Build Coastguard Worker    } while (0)
5087*da0073e9SAndroid Build Coastguard Worker 
5088*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5,  \
5089*da0073e9SAndroid Build Coastguard Worker                      arg6, arg7 ,arg8, arg9, arg10)              \
5090*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
5091*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
5092*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                        \
5093*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
5094*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
5095*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
5096*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
5097*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
5098*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                          \
5099*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                          \
5100*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                          \
5101*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                          \
5102*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                          \
5103*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                          \
5104*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)arg10;                        \
5105*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
5106*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
5107*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-200\n\t"                                      \
5108*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
5109*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
5110*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
5111*da0073e9SAndroid Build Coastguard Worker          "lg 5,32(1)\n\t"                                        \
5112*da0073e9SAndroid Build Coastguard Worker          "lg 6,40(1)\n\t"                                        \
5113*da0073e9SAndroid Build Coastguard Worker          "mvc 160(8,15), 48(1)\n\t"                              \
5114*da0073e9SAndroid Build Coastguard Worker          "mvc 168(8,15), 56(1)\n\t"                              \
5115*da0073e9SAndroid Build Coastguard Worker          "mvc 176(8,15), 64(1)\n\t"                              \
5116*da0073e9SAndroid Build Coastguard Worker          "mvc 184(8,15), 72(1)\n\t"                              \
5117*da0073e9SAndroid Build Coastguard Worker          "mvc 192(8,15), 80(1)\n\t"                              \
5118*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
5119*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
5120*da0073e9SAndroid Build Coastguard Worker          "aghi 15,200\n\t"                                       \
5121*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
5122*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
5123*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
5124*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
5125*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5126*da0073e9SAndroid Build Coastguard Worker       );                                                         \
5127*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
5128*da0073e9SAndroid Build Coastguard Worker    } while (0)
5129*da0073e9SAndroid Build Coastguard Worker 
5130*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5,  \
5131*da0073e9SAndroid Build Coastguard Worker                      arg6, arg7 ,arg8, arg9, arg10, arg11)       \
5132*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
5133*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
5134*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                        \
5135*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
5136*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
5137*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
5138*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
5139*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
5140*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                          \
5141*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                          \
5142*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                          \
5143*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                          \
5144*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                          \
5145*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                          \
5146*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)arg10;                        \
5147*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)arg11;                        \
5148*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
5149*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
5150*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-208\n\t"                                      \
5151*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
5152*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
5153*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
5154*da0073e9SAndroid Build Coastguard Worker          "lg 5,32(1)\n\t"                                        \
5155*da0073e9SAndroid Build Coastguard Worker          "lg 6,40(1)\n\t"                                        \
5156*da0073e9SAndroid Build Coastguard Worker          "mvc 160(8,15), 48(1)\n\t"                              \
5157*da0073e9SAndroid Build Coastguard Worker          "mvc 168(8,15), 56(1)\n\t"                              \
5158*da0073e9SAndroid Build Coastguard Worker          "mvc 176(8,15), 64(1)\n\t"                              \
5159*da0073e9SAndroid Build Coastguard Worker          "mvc 184(8,15), 72(1)\n\t"                              \
5160*da0073e9SAndroid Build Coastguard Worker          "mvc 192(8,15), 80(1)\n\t"                              \
5161*da0073e9SAndroid Build Coastguard Worker          "mvc 200(8,15), 88(1)\n\t"                              \
5162*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
5163*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
5164*da0073e9SAndroid Build Coastguard Worker          "aghi 15,208\n\t"                                       \
5165*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
5166*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
5167*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
5168*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
5169*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5170*da0073e9SAndroid Build Coastguard Worker       );                                                         \
5171*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
5172*da0073e9SAndroid Build Coastguard Worker    } while (0)
5173*da0073e9SAndroid Build Coastguard Worker 
5174*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5,  \
5175*da0073e9SAndroid Build Coastguard Worker                      arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\
5176*da0073e9SAndroid Build Coastguard Worker    do {                                                          \
5177*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                     \
5178*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                        \
5179*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                               \
5180*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                  \
5181*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                          \
5182*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                          \
5183*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                          \
5184*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                          \
5185*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                          \
5186*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                          \
5187*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                          \
5188*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                          \
5189*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                          \
5190*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)arg10;                        \
5191*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)arg11;                        \
5192*da0073e9SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)arg12;                        \
5193*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                          \
5194*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                   \
5195*da0073e9SAndroid Build Coastguard Worker          "aghi 15,-216\n\t"                                      \
5196*da0073e9SAndroid Build Coastguard Worker          "lg 2, 8(1)\n\t"                                        \
5197*da0073e9SAndroid Build Coastguard Worker          "lg 3,16(1)\n\t"                                        \
5198*da0073e9SAndroid Build Coastguard Worker          "lg 4,24(1)\n\t"                                        \
5199*da0073e9SAndroid Build Coastguard Worker          "lg 5,32(1)\n\t"                                        \
5200*da0073e9SAndroid Build Coastguard Worker          "lg 6,40(1)\n\t"                                        \
5201*da0073e9SAndroid Build Coastguard Worker          "mvc 160(8,15), 48(1)\n\t"                              \
5202*da0073e9SAndroid Build Coastguard Worker          "mvc 168(8,15), 56(1)\n\t"                              \
5203*da0073e9SAndroid Build Coastguard Worker          "mvc 176(8,15), 64(1)\n\t"                              \
5204*da0073e9SAndroid Build Coastguard Worker          "mvc 184(8,15), 72(1)\n\t"                              \
5205*da0073e9SAndroid Build Coastguard Worker          "mvc 192(8,15), 80(1)\n\t"                              \
5206*da0073e9SAndroid Build Coastguard Worker          "mvc 200(8,15), 88(1)\n\t"                              \
5207*da0073e9SAndroid Build Coastguard Worker          "mvc 208(8,15), 96(1)\n\t"                              \
5208*da0073e9SAndroid Build Coastguard Worker          "lg 1, 0(1)\n\t"                                        \
5209*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_R1                                \
5210*da0073e9SAndroid Build Coastguard Worker          "aghi 15,216\n\t"                                       \
5211*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                   \
5212*da0073e9SAndroid Build Coastguard Worker          "lgr %0, 2\n\t"                                         \
5213*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=d" (_res)                                 \
5214*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
5215*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5216*da0073e9SAndroid Build Coastguard Worker       );                                                         \
5217*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                            \
5218*da0073e9SAndroid Build Coastguard Worker    } while (0)
5219*da0073e9SAndroid Build Coastguard Worker 
5220*da0073e9SAndroid Build Coastguard Worker 
5221*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_s390x_linux */
5222*da0073e9SAndroid Build Coastguard Worker 
5223*da0073e9SAndroid Build Coastguard Worker /* ------------------------- mips32-linux ----------------------- */
5224*da0073e9SAndroid Build Coastguard Worker 
5225*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_mips32_linux)
5226*da0073e9SAndroid Build Coastguard Worker 
5227*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
5228*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6",       \
5229*da0073e9SAndroid Build Coastguard Worker "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
5230*da0073e9SAndroid Build Coastguard Worker "$25", "$31"
5231*da0073e9SAndroid Build Coastguard Worker 
5232*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned
5233*da0073e9SAndroid Build Coastguard Worker    long) == 4. */
5234*da0073e9SAndroid Build Coastguard Worker 
5235*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
5236*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5237*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5238*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
5239*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5240*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5241*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5242*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5243*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5244*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5245*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 16 \n\t"                                 \
5246*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5247*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5248*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 16\n\t"                                  \
5249*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5250*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5251*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5252*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5253*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5254*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5255*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5256*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5257*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5258*da0073e9SAndroid Build Coastguard Worker    } while (0)
5259*da0073e9SAndroid Build Coastguard Worker 
5260*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
5261*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5262*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5263*da0073e9SAndroid Build Coastguard Worker      volatile unsigned long _argvec[2];                           \
5264*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5265*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5266*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5267*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5268*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5269*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5270*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5271*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 16 \n\t"                                 \
5272*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"   /* arg1*/                          \
5273*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5274*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5275*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 16 \n\t"                                 \
5276*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5277*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5278*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5279*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5280*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5281*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5282*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory",  __CALLER_SAVED_REGS               \
5283*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5284*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5285*da0073e9SAndroid Build Coastguard Worker    } while (0)
5286*da0073e9SAndroid Build Coastguard Worker 
5287*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
5288*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5289*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5290*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
5291*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5292*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5293*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5294*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5295*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5296*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5297*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5298*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5299*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 16 \n\t"                                 \
5300*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5301*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5302*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5303*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5304*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 16 \n\t"                                 \
5305*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5306*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5307*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5308*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5309*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5310*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5311*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5312*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5313*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5314*da0073e9SAndroid Build Coastguard Worker    } while (0)
5315*da0073e9SAndroid Build Coastguard Worker 
5316*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
5317*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5318*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5319*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
5320*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5321*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5322*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5323*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5324*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5325*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5326*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5327*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5328*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5329*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 16 \n\t"                                 \
5330*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5331*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5332*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5333*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5334*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5335*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 16 \n\t"                                 \
5336*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5337*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5338*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5339*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5340*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5341*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5342*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5343*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5344*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5345*da0073e9SAndroid Build Coastguard Worker    } while (0)
5346*da0073e9SAndroid Build Coastguard Worker 
5347*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
5348*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5349*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5350*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
5351*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5352*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5353*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5354*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5355*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5356*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5357*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5358*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5359*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5360*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5361*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 16 \n\t"                                 \
5362*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5363*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5364*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5365*da0073e9SAndroid Build Coastguard Worker          "lw $7, 16(%1) \n\t"                                     \
5366*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5367*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5368*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 16 \n\t"                                 \
5369*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5370*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5371*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5372*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5373*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5374*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5375*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5376*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5377*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5378*da0073e9SAndroid Build Coastguard Worker    } while (0)
5379*da0073e9SAndroid Build Coastguard Worker 
5380*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
5381*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5382*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5383*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
5384*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5385*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5386*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5387*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5388*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5389*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5390*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5391*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5392*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5393*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5394*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5395*da0073e9SAndroid Build Coastguard Worker          "lw $4, 20(%1) \n\t"                                     \
5396*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 24\n\t"                                  \
5397*da0073e9SAndroid Build Coastguard Worker          "sw $4, 16($29) \n\t"                                    \
5398*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5399*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5400*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5401*da0073e9SAndroid Build Coastguard Worker          "lw $7, 16(%1) \n\t"                                     \
5402*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5403*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5404*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 24 \n\t"                                 \
5405*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5406*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5407*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5408*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5409*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5410*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5411*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5412*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5413*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5414*da0073e9SAndroid Build Coastguard Worker    } while (0)
5415*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
5416*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5417*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5418*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
5419*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5420*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5421*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5422*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5423*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5424*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5425*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5426*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5427*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5428*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5429*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5430*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5431*da0073e9SAndroid Build Coastguard Worker          "lw $4, 20(%1) \n\t"                                     \
5432*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 32\n\t"                                  \
5433*da0073e9SAndroid Build Coastguard Worker          "sw $4, 16($29) \n\t"                                    \
5434*da0073e9SAndroid Build Coastguard Worker          "lw $4, 24(%1) \n\t"                                     \
5435*da0073e9SAndroid Build Coastguard Worker          "nop\n\t"                                                \
5436*da0073e9SAndroid Build Coastguard Worker          "sw $4, 20($29) \n\t"                                    \
5437*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5438*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5439*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5440*da0073e9SAndroid Build Coastguard Worker          "lw $7, 16(%1) \n\t"                                     \
5441*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5442*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5443*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 32 \n\t"                                 \
5444*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5445*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5446*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5447*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5448*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5449*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5450*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5451*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5452*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5453*da0073e9SAndroid Build Coastguard Worker    } while (0)
5454*da0073e9SAndroid Build Coastguard Worker 
5455*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
5456*da0073e9SAndroid Build Coastguard Worker                                  arg7)                            \
5457*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5458*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5459*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
5460*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5461*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5462*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5463*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5464*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5465*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5466*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5467*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5468*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
5469*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5470*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5471*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5472*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5473*da0073e9SAndroid Build Coastguard Worker          "lw $4, 20(%1) \n\t"                                     \
5474*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 32\n\t"                                  \
5475*da0073e9SAndroid Build Coastguard Worker          "sw $4, 16($29) \n\t"                                    \
5476*da0073e9SAndroid Build Coastguard Worker          "lw $4, 24(%1) \n\t"                                     \
5477*da0073e9SAndroid Build Coastguard Worker          "sw $4, 20($29) \n\t"                                    \
5478*da0073e9SAndroid Build Coastguard Worker          "lw $4, 28(%1) \n\t"                                     \
5479*da0073e9SAndroid Build Coastguard Worker          "sw $4, 24($29) \n\t"                                    \
5480*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5481*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5482*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5483*da0073e9SAndroid Build Coastguard Worker          "lw $7, 16(%1) \n\t"                                     \
5484*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5485*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5486*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 32 \n\t"                                 \
5487*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5488*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5489*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5490*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5491*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5492*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5493*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5494*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5495*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5496*da0073e9SAndroid Build Coastguard Worker    } while (0)
5497*da0073e9SAndroid Build Coastguard Worker 
5498*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
5499*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
5500*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5501*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5502*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
5503*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5504*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5505*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5506*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5507*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5508*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5509*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5510*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5511*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
5512*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
5513*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5514*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5515*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5516*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5517*da0073e9SAndroid Build Coastguard Worker          "lw $4, 20(%1) \n\t"                                     \
5518*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 40\n\t"                                  \
5519*da0073e9SAndroid Build Coastguard Worker          "sw $4, 16($29) \n\t"                                    \
5520*da0073e9SAndroid Build Coastguard Worker          "lw $4, 24(%1) \n\t"                                     \
5521*da0073e9SAndroid Build Coastguard Worker          "sw $4, 20($29) \n\t"                                    \
5522*da0073e9SAndroid Build Coastguard Worker          "lw $4, 28(%1) \n\t"                                     \
5523*da0073e9SAndroid Build Coastguard Worker          "sw $4, 24($29) \n\t"                                    \
5524*da0073e9SAndroid Build Coastguard Worker          "lw $4, 32(%1) \n\t"                                     \
5525*da0073e9SAndroid Build Coastguard Worker          "sw $4, 28($29) \n\t"                                    \
5526*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5527*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5528*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5529*da0073e9SAndroid Build Coastguard Worker          "lw $7, 16(%1) \n\t"                                     \
5530*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5531*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5532*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 40 \n\t"                                 \
5533*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5534*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5535*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5536*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5537*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5538*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5539*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5540*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5541*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5542*da0073e9SAndroid Build Coastguard Worker    } while (0)
5543*da0073e9SAndroid Build Coastguard Worker 
5544*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
5545*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
5546*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5547*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5548*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
5549*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5550*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5551*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5552*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5553*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5554*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5555*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5556*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5557*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
5558*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
5559*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
5560*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5561*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5562*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5563*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5564*da0073e9SAndroid Build Coastguard Worker          "lw $4, 20(%1) \n\t"                                     \
5565*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 40\n\t"                                  \
5566*da0073e9SAndroid Build Coastguard Worker          "sw $4, 16($29) \n\t"                                    \
5567*da0073e9SAndroid Build Coastguard Worker          "lw $4, 24(%1) \n\t"                                     \
5568*da0073e9SAndroid Build Coastguard Worker          "sw $4, 20($29) \n\t"                                    \
5569*da0073e9SAndroid Build Coastguard Worker          "lw $4, 28(%1) \n\t"                                     \
5570*da0073e9SAndroid Build Coastguard Worker          "sw $4, 24($29) \n\t"                                    \
5571*da0073e9SAndroid Build Coastguard Worker          "lw $4, 32(%1) \n\t"                                     \
5572*da0073e9SAndroid Build Coastguard Worker          "sw $4, 28($29) \n\t"                                    \
5573*da0073e9SAndroid Build Coastguard Worker          "lw $4, 36(%1) \n\t"                                     \
5574*da0073e9SAndroid Build Coastguard Worker          "sw $4, 32($29) \n\t"                                    \
5575*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5576*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5577*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5578*da0073e9SAndroid Build Coastguard Worker          "lw $7, 16(%1) \n\t"                                     \
5579*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5580*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5581*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 40 \n\t"                                 \
5582*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5583*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5584*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5585*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5586*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5587*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5588*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5589*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5590*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5591*da0073e9SAndroid Build Coastguard Worker    } while (0)
5592*da0073e9SAndroid Build Coastguard Worker 
5593*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
5594*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
5595*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5596*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5597*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
5598*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5599*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5600*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5601*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5602*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5603*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5604*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5605*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5606*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
5607*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
5608*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
5609*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
5610*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5611*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5612*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5613*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5614*da0073e9SAndroid Build Coastguard Worker          "lw $4, 20(%1) \n\t"                                     \
5615*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 48\n\t"                                  \
5616*da0073e9SAndroid Build Coastguard Worker          "sw $4, 16($29) \n\t"                                    \
5617*da0073e9SAndroid Build Coastguard Worker          "lw $4, 24(%1) \n\t"                                     \
5618*da0073e9SAndroid Build Coastguard Worker          "sw $4, 20($29) \n\t"                                    \
5619*da0073e9SAndroid Build Coastguard Worker          "lw $4, 28(%1) \n\t"                                     \
5620*da0073e9SAndroid Build Coastguard Worker          "sw $4, 24($29) \n\t"                                    \
5621*da0073e9SAndroid Build Coastguard Worker          "lw $4, 32(%1) \n\t"                                     \
5622*da0073e9SAndroid Build Coastguard Worker          "sw $4, 28($29) \n\t"                                    \
5623*da0073e9SAndroid Build Coastguard Worker          "lw $4, 36(%1) \n\t"                                     \
5624*da0073e9SAndroid Build Coastguard Worker          "sw $4, 32($29) \n\t"                                    \
5625*da0073e9SAndroid Build Coastguard Worker          "lw $4, 40(%1) \n\t"                                     \
5626*da0073e9SAndroid Build Coastguard Worker          "sw $4, 36($29) \n\t"                                    \
5627*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5628*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5629*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5630*da0073e9SAndroid Build Coastguard Worker          "lw $7, 16(%1) \n\t"                                     \
5631*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5632*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5633*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 48 \n\t"                                 \
5634*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5635*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5636*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5637*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5638*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5639*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5640*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5641*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5642*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5643*da0073e9SAndroid Build Coastguard Worker    } while (0)
5644*da0073e9SAndroid Build Coastguard Worker 
5645*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
5646*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
5647*da0073e9SAndroid Build Coastguard Worker                                   arg11)                          \
5648*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5649*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5650*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
5651*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5652*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5653*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5654*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5655*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5656*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5657*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5658*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5659*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
5660*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
5661*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
5662*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
5663*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
5664*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5665*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5666*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5667*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5668*da0073e9SAndroid Build Coastguard Worker          "lw $4, 20(%1) \n\t"                                     \
5669*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 48\n\t"                                  \
5670*da0073e9SAndroid Build Coastguard Worker          "sw $4, 16($29) \n\t"                                    \
5671*da0073e9SAndroid Build Coastguard Worker          "lw $4, 24(%1) \n\t"                                     \
5672*da0073e9SAndroid Build Coastguard Worker          "sw $4, 20($29) \n\t"                                    \
5673*da0073e9SAndroid Build Coastguard Worker          "lw $4, 28(%1) \n\t"                                     \
5674*da0073e9SAndroid Build Coastguard Worker          "sw $4, 24($29) \n\t"                                    \
5675*da0073e9SAndroid Build Coastguard Worker          "lw $4, 32(%1) \n\t"                                     \
5676*da0073e9SAndroid Build Coastguard Worker          "sw $4, 28($29) \n\t"                                    \
5677*da0073e9SAndroid Build Coastguard Worker          "lw $4, 36(%1) \n\t"                                     \
5678*da0073e9SAndroid Build Coastguard Worker          "sw $4, 32($29) \n\t"                                    \
5679*da0073e9SAndroid Build Coastguard Worker          "lw $4, 40(%1) \n\t"                                     \
5680*da0073e9SAndroid Build Coastguard Worker          "sw $4, 36($29) \n\t"                                    \
5681*da0073e9SAndroid Build Coastguard Worker          "lw $4, 44(%1) \n\t"                                     \
5682*da0073e9SAndroid Build Coastguard Worker          "sw $4, 40($29) \n\t"                                    \
5683*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5684*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5685*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5686*da0073e9SAndroid Build Coastguard Worker          "lw $7, 16(%1) \n\t"                                     \
5687*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5688*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5689*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 48 \n\t"                                 \
5690*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5691*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5692*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5693*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5694*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5695*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
5696*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5697*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5698*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5699*da0073e9SAndroid Build Coastguard Worker    } while (0)
5700*da0073e9SAndroid Build Coastguard Worker 
5701*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
5702*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
5703*da0073e9SAndroid Build Coastguard Worker                                   arg11,arg12)                    \
5704*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5705*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5706*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
5707*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5708*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5709*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5710*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5711*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5712*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5713*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5714*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5715*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
5716*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
5717*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
5718*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
5719*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
5720*da0073e9SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)(arg12);                       \
5721*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5722*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 8 \n\t"                                  \
5723*da0073e9SAndroid Build Coastguard Worker          "sw $28, 0($29) \n\t"                                    \
5724*da0073e9SAndroid Build Coastguard Worker          "sw $31, 4($29) \n\t"                                    \
5725*da0073e9SAndroid Build Coastguard Worker          "lw $4, 20(%1) \n\t"                                     \
5726*da0073e9SAndroid Build Coastguard Worker          "subu $29, $29, 56\n\t"                                  \
5727*da0073e9SAndroid Build Coastguard Worker          "sw $4, 16($29) \n\t"                                    \
5728*da0073e9SAndroid Build Coastguard Worker          "lw $4, 24(%1) \n\t"                                     \
5729*da0073e9SAndroid Build Coastguard Worker          "sw $4, 20($29) \n\t"                                    \
5730*da0073e9SAndroid Build Coastguard Worker          "lw $4, 28(%1) \n\t"                                     \
5731*da0073e9SAndroid Build Coastguard Worker          "sw $4, 24($29) \n\t"                                    \
5732*da0073e9SAndroid Build Coastguard Worker          "lw $4, 32(%1) \n\t"                                     \
5733*da0073e9SAndroid Build Coastguard Worker          "sw $4, 28($29) \n\t"                                    \
5734*da0073e9SAndroid Build Coastguard Worker          "lw $4, 36(%1) \n\t"                                     \
5735*da0073e9SAndroid Build Coastguard Worker          "sw $4, 32($29) \n\t"                                    \
5736*da0073e9SAndroid Build Coastguard Worker          "lw $4, 40(%1) \n\t"                                     \
5737*da0073e9SAndroid Build Coastguard Worker          "sw $4, 36($29) \n\t"                                    \
5738*da0073e9SAndroid Build Coastguard Worker          "lw $4, 44(%1) \n\t"                                     \
5739*da0073e9SAndroid Build Coastguard Worker          "sw $4, 40($29) \n\t"                                    \
5740*da0073e9SAndroid Build Coastguard Worker          "lw $4, 48(%1) \n\t"                                     \
5741*da0073e9SAndroid Build Coastguard Worker          "sw $4, 44($29) \n\t"                                    \
5742*da0073e9SAndroid Build Coastguard Worker          "lw $4, 4(%1) \n\t"                                      \
5743*da0073e9SAndroid Build Coastguard Worker          "lw $5, 8(%1) \n\t"                                      \
5744*da0073e9SAndroid Build Coastguard Worker          "lw $6, 12(%1) \n\t"                                     \
5745*da0073e9SAndroid Build Coastguard Worker          "lw $7, 16(%1) \n\t"                                     \
5746*da0073e9SAndroid Build Coastguard Worker          "lw $25, 0(%1) \n\t"  /* target->t9 */                   \
5747*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5748*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 56 \n\t"                                 \
5749*da0073e9SAndroid Build Coastguard Worker          "lw $28, 0($29) \n\t"                                    \
5750*da0073e9SAndroid Build Coastguard Worker          "lw $31, 4($29) \n\t"                                    \
5751*da0073e9SAndroid Build Coastguard Worker          "addu $29, $29, 8 \n\t"                                  \
5752*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
5753*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5754*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5755*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5756*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5757*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5758*da0073e9SAndroid Build Coastguard Worker    } while (0)
5759*da0073e9SAndroid Build Coastguard Worker 
5760*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_mips32_linux */
5761*da0073e9SAndroid Build Coastguard Worker 
5762*da0073e9SAndroid Build Coastguard Worker /* ------------------------- nanomips-linux -------------------- */
5763*da0073e9SAndroid Build Coastguard Worker 
5764*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_nanomips_linux)
5765*da0073e9SAndroid Build Coastguard Worker 
5766*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
5767*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "$t4", "$t5", "$a0", "$a1", "$a2",     \
5768*da0073e9SAndroid Build Coastguard Worker "$a3", "$a4", "$a5", "$a6", "$a7", "$t0", "$t1", "$t2", "$t3",     \
5769*da0073e9SAndroid Build Coastguard Worker "$t8","$t9", "$at"
5770*da0073e9SAndroid Build Coastguard Worker 
5771*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned
5772*da0073e9SAndroid Build Coastguard Worker    long) == 4. */
5773*da0073e9SAndroid Build Coastguard Worker 
5774*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
5775*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5776*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5777*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
5778*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5779*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5780*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5781*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)\n\t"                                      \
5782*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5783*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0\n"                                         \
5784*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5785*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5786*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5787*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5788*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5789*da0073e9SAndroid Build Coastguard Worker    } while (0)
5790*da0073e9SAndroid Build Coastguard Worker 
5791*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
5792*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5793*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5794*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                          \
5795*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5796*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5797*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5798*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5799*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)\n\t"                                      \
5800*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)\n\t"                                      \
5801*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5802*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0\n"                                         \
5803*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5804*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5805*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5806*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5807*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5808*da0073e9SAndroid Build Coastguard Worker    } while (0)
5809*da0073e9SAndroid Build Coastguard Worker 
5810*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
5811*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5812*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5813*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
5814*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5815*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5816*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5817*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5818*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5819*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)\n\t"                                      \
5820*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)\n\t"                                      \
5821*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)\n\t"                                      \
5822*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5823*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0\n"                                         \
5824*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5825*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5826*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5827*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5828*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5829*da0073e9SAndroid Build Coastguard Worker    } while (0)
5830*da0073e9SAndroid Build Coastguard Worker 
5831*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
5832*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5833*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5834*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
5835*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5836*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5837*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5838*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5839*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5840*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5841*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)\n\t"                                      \
5842*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)\n\t"                                      \
5843*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)\n\t"                                      \
5844*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)\n\t"                                      \
5845*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5846*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0\n"                                         \
5847*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5848*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5849*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5850*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5851*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5852*da0073e9SAndroid Build Coastguard Worker    } while (0)
5853*da0073e9SAndroid Build Coastguard Worker 
5854*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
5855*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5856*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5857*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
5858*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5859*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5860*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5861*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5862*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5863*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5864*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5865*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)\n\t"                                      \
5866*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)\n\t"                                      \
5867*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)\n\t"                                      \
5868*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)\n\t"                                      \
5869*da0073e9SAndroid Build Coastguard Worker          "lw $a3,16(%1)\n\t"                                      \
5870*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5871*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0\n"                                         \
5872*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5873*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5874*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5875*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5876*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5877*da0073e9SAndroid Build Coastguard Worker    } while (0)
5878*da0073e9SAndroid Build Coastguard Worker 
5879*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
5880*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5881*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5882*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
5883*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5884*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5885*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5886*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5887*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5888*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5889*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5890*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5891*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)\n\t"                                      \
5892*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)\n\t"                                      \
5893*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)\n\t"                                      \
5894*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)\n\t"                                      \
5895*da0073e9SAndroid Build Coastguard Worker          "lw $a3,16(%1)\n\t"                                      \
5896*da0073e9SAndroid Build Coastguard Worker          "lw $a4,20(%1)\n\t"                                      \
5897*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5898*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0\n"                                         \
5899*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5900*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5901*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5902*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5903*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5904*da0073e9SAndroid Build Coastguard Worker    } while (0)
5905*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
5906*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5907*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5908*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
5909*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5910*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5911*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5912*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5913*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5914*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5915*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5916*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5917*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5918*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)\n\t"                                      \
5919*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)\n\t"                                      \
5920*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)\n\t"                                      \
5921*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)\n\t"                                      \
5922*da0073e9SAndroid Build Coastguard Worker          "lw $a3,16(%1)\n\t"                                      \
5923*da0073e9SAndroid Build Coastguard Worker          "lw $a4,20(%1)\n\t"                                      \
5924*da0073e9SAndroid Build Coastguard Worker          "lw $a5,24(%1)\n\t"                                      \
5925*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5926*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0\n"                                         \
5927*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5928*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5929*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5930*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5931*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5932*da0073e9SAndroid Build Coastguard Worker    } while (0)
5933*da0073e9SAndroid Build Coastguard Worker 
5934*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
5935*da0073e9SAndroid Build Coastguard Worker                                  arg7)                            \
5936*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5937*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5938*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
5939*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5940*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5941*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5942*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5943*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5944*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5945*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5946*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5947*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
5948*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5949*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)\n\t"                                      \
5950*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)\n\t"                                      \
5951*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)\n\t"                                      \
5952*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)\n\t"                                      \
5953*da0073e9SAndroid Build Coastguard Worker          "lw $a3,16(%1)\n\t"                                      \
5954*da0073e9SAndroid Build Coastguard Worker          "lw $a4,20(%1)\n\t"                                      \
5955*da0073e9SAndroid Build Coastguard Worker          "lw $a5,24(%1)\n\t"                                      \
5956*da0073e9SAndroid Build Coastguard Worker          "lw $a6,28(%1)\n\t"                                      \
5957*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5958*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0\n"                                         \
5959*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5960*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5961*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5962*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5963*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5964*da0073e9SAndroid Build Coastguard Worker    } while (0)
5965*da0073e9SAndroid Build Coastguard Worker 
5966*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
5967*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
5968*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
5969*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
5970*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
5971*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
5972*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
5973*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
5974*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
5975*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
5976*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
5977*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
5978*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
5979*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
5980*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
5981*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
5982*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)\n\t"                                      \
5983*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)\n\t"                                      \
5984*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)\n\t"                                      \
5985*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)\n\t"                                      \
5986*da0073e9SAndroid Build Coastguard Worker          "lw $a3,16(%1)\n\t"                                      \
5987*da0073e9SAndroid Build Coastguard Worker          "lw $a4,20(%1)\n\t"                                      \
5988*da0073e9SAndroid Build Coastguard Worker          "lw $a5,24(%1)\n\t"                                      \
5989*da0073e9SAndroid Build Coastguard Worker          "lw $a6,28(%1)\n\t"                                      \
5990*da0073e9SAndroid Build Coastguard Worker          "lw $a7,32(%1)\n\t"                                      \
5991*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
5992*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0\n"                                         \
5993*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
5994*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
5995*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
5996*da0073e9SAndroid Build Coastguard Worker       );                                                          \
5997*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
5998*da0073e9SAndroid Build Coastguard Worker    } while (0)
5999*da0073e9SAndroid Build Coastguard Worker 
6000*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
6001*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
6002*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6003*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6004*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
6005*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
6006*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
6007*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
6008*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
6009*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
6010*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
6011*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
6012*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
6013*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
6014*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
6015*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
6016*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6017*da0073e9SAndroid Build Coastguard Worker          "addiu $sp, $sp, -16  \n\t"                              \
6018*da0073e9SAndroid Build Coastguard Worker          "lw $t9,36(%1)        \n\t"                              \
6019*da0073e9SAndroid Build Coastguard Worker          "sw $t9, 0($sp)       \n\t"                              \
6020*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)        \n\t"                              \
6021*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)        \n\t"                              \
6022*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)        \n\t"                              \
6023*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)        \n\t"                              \
6024*da0073e9SAndroid Build Coastguard Worker          "lw $a3,16(%1)        \n\t"                              \
6025*da0073e9SAndroid Build Coastguard Worker          "lw $a4,20(%1)        \n\t"                              \
6026*da0073e9SAndroid Build Coastguard Worker          "lw $a5,24(%1)        \n\t"                              \
6027*da0073e9SAndroid Build Coastguard Worker          "lw $a6,28(%1)        \n\t"                              \
6028*da0073e9SAndroid Build Coastguard Worker          "lw $a7,32(%1)        \n\t"                              \
6029*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6030*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0         \n\t"                              \
6031*da0073e9SAndroid Build Coastguard Worker          "addiu $sp, $sp, 16   \n\t"                              \
6032*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6033*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6034*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6035*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6036*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
6037*da0073e9SAndroid Build Coastguard Worker    } while (0)
6038*da0073e9SAndroid Build Coastguard Worker 
6039*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
6040*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
6041*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6042*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6043*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
6044*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
6045*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
6046*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
6047*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
6048*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
6049*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
6050*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
6051*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
6052*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
6053*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
6054*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
6055*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
6056*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6057*da0073e9SAndroid Build Coastguard Worker          "addiu $sp, $sp, -16  \n\t"                              \
6058*da0073e9SAndroid Build Coastguard Worker          "lw $t9,36(%1)        \n\t"                              \
6059*da0073e9SAndroid Build Coastguard Worker          "sw $t9, 0($sp)       \n\t"                              \
6060*da0073e9SAndroid Build Coastguard Worker          "lw $t9,40(%1)        \n\t"                              \
6061*da0073e9SAndroid Build Coastguard Worker          "sw $t9, 4($sp)       \n\t"                              \
6062*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)        \n\t"                              \
6063*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)        \n\t"                              \
6064*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)        \n\t"                              \
6065*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)        \n\t"                              \
6066*da0073e9SAndroid Build Coastguard Worker          "lw $a3,16(%1)        \n\t"                              \
6067*da0073e9SAndroid Build Coastguard Worker          "lw $a4,20(%1)        \n\t"                              \
6068*da0073e9SAndroid Build Coastguard Worker          "lw $a5,24(%1)        \n\t"                              \
6069*da0073e9SAndroid Build Coastguard Worker          "lw $a6,28(%1)        \n\t"                              \
6070*da0073e9SAndroid Build Coastguard Worker          "lw $a7,32(%1)        \n\t"                              \
6071*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6072*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0         \n\t"                              \
6073*da0073e9SAndroid Build Coastguard Worker          "addiu $sp, $sp, 16   \n\t"                              \
6074*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6075*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6076*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6077*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6078*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
6079*da0073e9SAndroid Build Coastguard Worker    } while (0)
6080*da0073e9SAndroid Build Coastguard Worker 
6081*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
6082*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
6083*da0073e9SAndroid Build Coastguard Worker                                   arg11)                          \
6084*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6085*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6086*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
6087*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
6088*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
6089*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
6090*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
6091*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
6092*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
6093*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
6094*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
6095*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
6096*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
6097*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
6098*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
6099*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
6100*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6101*da0073e9SAndroid Build Coastguard Worker          "addiu $sp, $sp, -16  \n\t"                              \
6102*da0073e9SAndroid Build Coastguard Worker          "lw $t9,36(%1)        \n\t"                              \
6103*da0073e9SAndroid Build Coastguard Worker          "sw $t9, 0($sp)       \n\t"                              \
6104*da0073e9SAndroid Build Coastguard Worker          "lw $t9,40(%1)        \n\t"                              \
6105*da0073e9SAndroid Build Coastguard Worker          "sw $t9, 4($sp)       \n\t"                              \
6106*da0073e9SAndroid Build Coastguard Worker          "lw $t9,44(%1)        \n\t"                              \
6107*da0073e9SAndroid Build Coastguard Worker          "sw $t9, 8($sp)       \n\t"                              \
6108*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)        \n\t"                              \
6109*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)        \n\t"                              \
6110*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)        \n\t"                              \
6111*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)        \n\t"                              \
6112*da0073e9SAndroid Build Coastguard Worker          "lw $a3,16(%1)        \n\t"                              \
6113*da0073e9SAndroid Build Coastguard Worker          "lw $a4,20(%1)        \n\t"                              \
6114*da0073e9SAndroid Build Coastguard Worker          "lw $a5,24(%1)        \n\t"                              \
6115*da0073e9SAndroid Build Coastguard Worker          "lw $a6,28(%1)        \n\t"                              \
6116*da0073e9SAndroid Build Coastguard Worker          "lw $a7,32(%1)        \n\t"                              \
6117*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6118*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0         \n\t"                              \
6119*da0073e9SAndroid Build Coastguard Worker          "addiu $sp, $sp, 16   \n\t"                              \
6120*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6121*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6122*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6123*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6124*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
6125*da0073e9SAndroid Build Coastguard Worker    } while (0)
6126*da0073e9SAndroid Build Coastguard Worker 
6127*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
6128*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
6129*da0073e9SAndroid Build Coastguard Worker                                   arg11,arg12)                    \
6130*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6131*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6132*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
6133*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
6134*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
6135*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
6136*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
6137*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
6138*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
6139*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
6140*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
6141*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
6142*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
6143*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
6144*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
6145*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
6146*da0073e9SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)(arg12);                       \
6147*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6148*da0073e9SAndroid Build Coastguard Worker          "addiu $sp, $sp, -16  \n\t"                              \
6149*da0073e9SAndroid Build Coastguard Worker          "lw $t9,36(%1)        \n\t"                              \
6150*da0073e9SAndroid Build Coastguard Worker          "sw $t9, 0($sp)       \n\t"                              \
6151*da0073e9SAndroid Build Coastguard Worker          "lw $t9,40(%1)        \n\t"                              \
6152*da0073e9SAndroid Build Coastguard Worker          "sw $t9, 4($sp)       \n\t"                              \
6153*da0073e9SAndroid Build Coastguard Worker          "lw $t9,44(%1)        \n\t"                              \
6154*da0073e9SAndroid Build Coastguard Worker          "sw $t9, 8($sp)       \n\t"                              \
6155*da0073e9SAndroid Build Coastguard Worker          "lw $t9,48(%1)        \n\t"                              \
6156*da0073e9SAndroid Build Coastguard Worker          "sw $t9,12($sp)       \n\t"                              \
6157*da0073e9SAndroid Build Coastguard Worker          "lw $t9, 0(%1)        \n\t"                              \
6158*da0073e9SAndroid Build Coastguard Worker          "lw $a0, 4(%1)        \n\t"                              \
6159*da0073e9SAndroid Build Coastguard Worker          "lw $a1, 8(%1)        \n\t"                              \
6160*da0073e9SAndroid Build Coastguard Worker          "lw $a2,12(%1)        \n\t"                              \
6161*da0073e9SAndroid Build Coastguard Worker          "lw $a3,16(%1)        \n\t"                              \
6162*da0073e9SAndroid Build Coastguard Worker          "lw $a4,20(%1)        \n\t"                              \
6163*da0073e9SAndroid Build Coastguard Worker          "lw $a5,24(%1)        \n\t"                              \
6164*da0073e9SAndroid Build Coastguard Worker          "lw $a6,28(%1)        \n\t"                              \
6165*da0073e9SAndroid Build Coastguard Worker          "lw $a7,32(%1)        \n\t"                              \
6166*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6167*da0073e9SAndroid Build Coastguard Worker          "move %0, $a0         \n\t"                              \
6168*da0073e9SAndroid Build Coastguard Worker          "addiu $sp, $sp, 16   \n\t"                              \
6169*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6170*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6171*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6172*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6173*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
6174*da0073e9SAndroid Build Coastguard Worker    } while (0)
6175*da0073e9SAndroid Build Coastguard Worker 
6176*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_nanomips_linux */
6177*da0073e9SAndroid Build Coastguard Worker 
6178*da0073e9SAndroid Build Coastguard Worker /* ------------------------- mips64-linux ------------------------- */
6179*da0073e9SAndroid Build Coastguard Worker 
6180*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_mips64_linux)
6181*da0073e9SAndroid Build Coastguard Worker 
6182*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
6183*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6",       \
6184*da0073e9SAndroid Build Coastguard Worker "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
6185*da0073e9SAndroid Build Coastguard Worker "$25", "$31"
6186*da0073e9SAndroid Build Coastguard Worker 
6187*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on mips64-linux,
6188*da0073e9SAndroid Build Coastguard Worker    sizeof(long long) == 8. */
6189*da0073e9SAndroid Build Coastguard Worker 
6190*da0073e9SAndroid Build Coastguard Worker #define MIPS64_LONG2REG_CAST(x) ((long long)(long)x)
6191*da0073e9SAndroid Build Coastguard Worker 
6192*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
6193*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6194*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6195*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[1];                     \
6196*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6197*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6198*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6199*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6200*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6201*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6202*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6203*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
6204*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6205*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6206*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6207*da0073e9SAndroid Build Coastguard Worker    } while (0)
6208*da0073e9SAndroid Build Coastguard Worker 
6209*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
6210*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6211*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6212*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[2];                     \
6213*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long  _res;                          \
6214*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6215*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6216*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6217*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"   /* arg1*/                           \
6218*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6219*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6220*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6221*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6222*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6223*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6224*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6225*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6226*da0073e9SAndroid Build Coastguard Worker    } while (0)
6227*da0073e9SAndroid Build Coastguard Worker 
6228*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
6229*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6230*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6231*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[3];                     \
6232*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6233*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = _orig.nraddr;                                  \
6234*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6235*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6236*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6237*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6238*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6239*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6240*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6241*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6242*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6243*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6244*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6245*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6246*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6247*da0073e9SAndroid Build Coastguard Worker    } while (0)
6248*da0073e9SAndroid Build Coastguard Worker 
6249*da0073e9SAndroid Build Coastguard Worker 
6250*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
6251*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6252*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6253*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[4];                     \
6254*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6255*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = _orig.nraddr;                                  \
6256*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6257*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6258*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6259*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6260*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6261*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6262*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6263*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6264*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6265*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6266*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6267*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6268*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6269*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6270*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6271*da0073e9SAndroid Build Coastguard Worker    } while (0)
6272*da0073e9SAndroid Build Coastguard Worker 
6273*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
6274*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6275*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6276*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[5];                     \
6277*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6278*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6279*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6280*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6281*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6282*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
6283*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6284*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6285*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6286*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6287*da0073e9SAndroid Build Coastguard Worker          "ld $7, 32(%1)\n\t"                                      \
6288*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6289*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6290*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6291*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6292*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6293*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6294*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6295*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6296*da0073e9SAndroid Build Coastguard Worker    } while (0)
6297*da0073e9SAndroid Build Coastguard Worker 
6298*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
6299*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6300*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6301*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[6];                     \
6302*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6303*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6304*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6305*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6306*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6307*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
6308*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
6309*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6310*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6311*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6312*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6313*da0073e9SAndroid Build Coastguard Worker          "ld $7, 32(%1)\n\t"                                      \
6314*da0073e9SAndroid Build Coastguard Worker          "ld $8, 40(%1)\n\t"                                      \
6315*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6316*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6317*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6318*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6319*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6320*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6321*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6322*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6323*da0073e9SAndroid Build Coastguard Worker    } while (0)
6324*da0073e9SAndroid Build Coastguard Worker 
6325*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
6326*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6327*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6328*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[7];                     \
6329*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6330*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6331*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6332*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6333*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6334*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
6335*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
6336*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
6337*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6338*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6339*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6340*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6341*da0073e9SAndroid Build Coastguard Worker          "ld $7, 32(%1)\n\t"                                      \
6342*da0073e9SAndroid Build Coastguard Worker          "ld $8, 40(%1)\n\t"                                      \
6343*da0073e9SAndroid Build Coastguard Worker          "ld $9, 48(%1)\n\t"                                      \
6344*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6345*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6346*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6347*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6348*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6349*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6350*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6351*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6352*da0073e9SAndroid Build Coastguard Worker    } while (0)
6353*da0073e9SAndroid Build Coastguard Worker 
6354*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
6355*da0073e9SAndroid Build Coastguard Worker                                  arg7)                            \
6356*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6357*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6358*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[8];                     \
6359*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6360*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6361*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6362*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6363*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6364*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
6365*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
6366*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
6367*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
6368*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6369*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6370*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6371*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6372*da0073e9SAndroid Build Coastguard Worker          "ld $7, 32(%1)\n\t"                                      \
6373*da0073e9SAndroid Build Coastguard Worker          "ld $8, 40(%1)\n\t"                                      \
6374*da0073e9SAndroid Build Coastguard Worker          "ld $9, 48(%1)\n\t"                                      \
6375*da0073e9SAndroid Build Coastguard Worker          "ld $10, 56(%1)\n\t"                                     \
6376*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1) \n\t"  /* target->t9 */                   \
6377*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6378*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6379*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6380*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6381*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6382*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6383*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6384*da0073e9SAndroid Build Coastguard Worker    } while (0)
6385*da0073e9SAndroid Build Coastguard Worker 
6386*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
6387*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
6388*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6389*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6390*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[9];                     \
6391*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6392*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6393*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6394*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6395*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6396*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
6397*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
6398*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
6399*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
6400*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
6401*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6402*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6403*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6404*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6405*da0073e9SAndroid Build Coastguard Worker          "ld $7, 32(%1)\n\t"                                      \
6406*da0073e9SAndroid Build Coastguard Worker          "ld $8, 40(%1)\n\t"                                      \
6407*da0073e9SAndroid Build Coastguard Worker          "ld $9, 48(%1)\n\t"                                      \
6408*da0073e9SAndroid Build Coastguard Worker          "ld $10, 56(%1)\n\t"                                     \
6409*da0073e9SAndroid Build Coastguard Worker          "ld $11, 64(%1)\n\t"                                     \
6410*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1) \n\t"  /* target->t9 */                   \
6411*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6412*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6413*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6414*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6415*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6416*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6417*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6418*da0073e9SAndroid Build Coastguard Worker    } while (0)
6419*da0073e9SAndroid Build Coastguard Worker 
6420*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
6421*da0073e9SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
6422*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6423*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6424*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[10];                    \
6425*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6426*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6427*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6428*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6429*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6430*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
6431*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
6432*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
6433*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
6434*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
6435*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = MIPS64_LONG2REG_CAST(arg9);                    \
6436*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6437*da0073e9SAndroid Build Coastguard Worker          "dsubu $29, $29, 8\n\t"                                  \
6438*da0073e9SAndroid Build Coastguard Worker          "ld $4, 72(%1)\n\t"                                      \
6439*da0073e9SAndroid Build Coastguard Worker          "sd $4, 0($29)\n\t"                                      \
6440*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6441*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6442*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6443*da0073e9SAndroid Build Coastguard Worker          "ld $7, 32(%1)\n\t"                                      \
6444*da0073e9SAndroid Build Coastguard Worker          "ld $8, 40(%1)\n\t"                                      \
6445*da0073e9SAndroid Build Coastguard Worker          "ld $9, 48(%1)\n\t"                                      \
6446*da0073e9SAndroid Build Coastguard Worker          "ld $10, 56(%1)\n\t"                                     \
6447*da0073e9SAndroid Build Coastguard Worker          "ld $11, 64(%1)\n\t"                                     \
6448*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6449*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6450*da0073e9SAndroid Build Coastguard Worker          "daddu $29, $29, 8\n\t"                                  \
6451*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6452*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6453*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6454*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6455*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6456*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6457*da0073e9SAndroid Build Coastguard Worker    } while (0)
6458*da0073e9SAndroid Build Coastguard Worker 
6459*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
6460*da0073e9SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
6461*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6462*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6463*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[11];                    \
6464*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6465*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6466*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6467*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6468*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6469*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
6470*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
6471*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
6472*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
6473*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
6474*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = MIPS64_LONG2REG_CAST(arg9);                    \
6475*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = MIPS64_LONG2REG_CAST(arg10);                  \
6476*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6477*da0073e9SAndroid Build Coastguard Worker          "dsubu $29, $29, 16\n\t"                                 \
6478*da0073e9SAndroid Build Coastguard Worker          "ld $4, 72(%1)\n\t"                                      \
6479*da0073e9SAndroid Build Coastguard Worker          "sd $4, 0($29)\n\t"                                      \
6480*da0073e9SAndroid Build Coastguard Worker          "ld $4, 80(%1)\n\t"                                      \
6481*da0073e9SAndroid Build Coastguard Worker          "sd $4, 8($29)\n\t"                                      \
6482*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6483*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6484*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6485*da0073e9SAndroid Build Coastguard Worker          "ld $7, 32(%1)\n\t"                                      \
6486*da0073e9SAndroid Build Coastguard Worker          "ld $8, 40(%1)\n\t"                                      \
6487*da0073e9SAndroid Build Coastguard Worker          "ld $9, 48(%1)\n\t"                                      \
6488*da0073e9SAndroid Build Coastguard Worker          "ld $10, 56(%1)\n\t"                                     \
6489*da0073e9SAndroid Build Coastguard Worker          "ld $11, 64(%1)\n\t"                                     \
6490*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6491*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6492*da0073e9SAndroid Build Coastguard Worker          "daddu $29, $29, 16\n\t"                                 \
6493*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6494*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6495*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6496*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6497*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6498*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6499*da0073e9SAndroid Build Coastguard Worker    } while (0)
6500*da0073e9SAndroid Build Coastguard Worker 
6501*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
6502*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
6503*da0073e9SAndroid Build Coastguard Worker                                   arg11)                          \
6504*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6505*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6506*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[12];                    \
6507*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6508*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6509*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6510*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6511*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6512*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
6513*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
6514*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
6515*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
6516*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
6517*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = MIPS64_LONG2REG_CAST(arg9);                    \
6518*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = MIPS64_LONG2REG_CAST(arg10);                  \
6519*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = MIPS64_LONG2REG_CAST(arg11);                  \
6520*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6521*da0073e9SAndroid Build Coastguard Worker          "dsubu $29, $29, 24\n\t"                                 \
6522*da0073e9SAndroid Build Coastguard Worker          "ld $4, 72(%1)\n\t"                                      \
6523*da0073e9SAndroid Build Coastguard Worker          "sd $4, 0($29)\n\t"                                      \
6524*da0073e9SAndroid Build Coastguard Worker          "ld $4, 80(%1)\n\t"                                      \
6525*da0073e9SAndroid Build Coastguard Worker          "sd $4, 8($29)\n\t"                                      \
6526*da0073e9SAndroid Build Coastguard Worker          "ld $4, 88(%1)\n\t"                                      \
6527*da0073e9SAndroid Build Coastguard Worker          "sd $4, 16($29)\n\t"                                     \
6528*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6529*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6530*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6531*da0073e9SAndroid Build Coastguard Worker          "ld $7, 32(%1)\n\t"                                      \
6532*da0073e9SAndroid Build Coastguard Worker          "ld $8, 40(%1)\n\t"                                      \
6533*da0073e9SAndroid Build Coastguard Worker          "ld $9, 48(%1)\n\t"                                      \
6534*da0073e9SAndroid Build Coastguard Worker          "ld $10, 56(%1)\n\t"                                     \
6535*da0073e9SAndroid Build Coastguard Worker          "ld $11, 64(%1)\n\t"                                     \
6536*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6537*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6538*da0073e9SAndroid Build Coastguard Worker          "daddu $29, $29, 24\n\t"                                 \
6539*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6540*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6541*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6542*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6543*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6544*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6545*da0073e9SAndroid Build Coastguard Worker    } while (0)
6546*da0073e9SAndroid Build Coastguard Worker 
6547*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
6548*da0073e9SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
6549*da0073e9SAndroid Build Coastguard Worker                                   arg11,arg12)                    \
6550*da0073e9SAndroid Build Coastguard Worker    do {                                                           \
6551*da0073e9SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
6552*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _argvec[13];                    \
6553*da0073e9SAndroid Build Coastguard Worker       volatile unsigned long long _res;                           \
6554*da0073e9SAndroid Build Coastguard Worker       _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr);            \
6555*da0073e9SAndroid Build Coastguard Worker       _argvec[1] = MIPS64_LONG2REG_CAST(arg1);                    \
6556*da0073e9SAndroid Build Coastguard Worker       _argvec[2] = MIPS64_LONG2REG_CAST(arg2);                    \
6557*da0073e9SAndroid Build Coastguard Worker       _argvec[3] = MIPS64_LONG2REG_CAST(arg3);                    \
6558*da0073e9SAndroid Build Coastguard Worker       _argvec[4] = MIPS64_LONG2REG_CAST(arg4);                    \
6559*da0073e9SAndroid Build Coastguard Worker       _argvec[5] = MIPS64_LONG2REG_CAST(arg5);                    \
6560*da0073e9SAndroid Build Coastguard Worker       _argvec[6] = MIPS64_LONG2REG_CAST(arg6);                    \
6561*da0073e9SAndroid Build Coastguard Worker       _argvec[7] = MIPS64_LONG2REG_CAST(arg7);                    \
6562*da0073e9SAndroid Build Coastguard Worker       _argvec[8] = MIPS64_LONG2REG_CAST(arg8);                    \
6563*da0073e9SAndroid Build Coastguard Worker       _argvec[9] = MIPS64_LONG2REG_CAST(arg9);                    \
6564*da0073e9SAndroid Build Coastguard Worker       _argvec[10] = MIPS64_LONG2REG_CAST(arg10);                  \
6565*da0073e9SAndroid Build Coastguard Worker       _argvec[11] = MIPS64_LONG2REG_CAST(arg11);                  \
6566*da0073e9SAndroid Build Coastguard Worker       _argvec[12] = MIPS64_LONG2REG_CAST(arg12);                  \
6567*da0073e9SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
6568*da0073e9SAndroid Build Coastguard Worker          "dsubu $29, $29, 32\n\t"                                 \
6569*da0073e9SAndroid Build Coastguard Worker          "ld $4, 72(%1)\n\t"                                      \
6570*da0073e9SAndroid Build Coastguard Worker          "sd $4, 0($29)\n\t"                                      \
6571*da0073e9SAndroid Build Coastguard Worker          "ld $4, 80(%1)\n\t"                                      \
6572*da0073e9SAndroid Build Coastguard Worker          "sd $4, 8($29)\n\t"                                      \
6573*da0073e9SAndroid Build Coastguard Worker          "ld $4, 88(%1)\n\t"                                      \
6574*da0073e9SAndroid Build Coastguard Worker          "sd $4, 16($29)\n\t"                                     \
6575*da0073e9SAndroid Build Coastguard Worker          "ld $4, 96(%1)\n\t"                                      \
6576*da0073e9SAndroid Build Coastguard Worker          "sd $4, 24($29)\n\t"                                     \
6577*da0073e9SAndroid Build Coastguard Worker          "ld $4, 8(%1)\n\t"                                       \
6578*da0073e9SAndroid Build Coastguard Worker          "ld $5, 16(%1)\n\t"                                      \
6579*da0073e9SAndroid Build Coastguard Worker          "ld $6, 24(%1)\n\t"                                      \
6580*da0073e9SAndroid Build Coastguard Worker          "ld $7, 32(%1)\n\t"                                      \
6581*da0073e9SAndroid Build Coastguard Worker          "ld $8, 40(%1)\n\t"                                      \
6582*da0073e9SAndroid Build Coastguard Worker          "ld $9, 48(%1)\n\t"                                      \
6583*da0073e9SAndroid Build Coastguard Worker          "ld $10, 56(%1)\n\t"                                     \
6584*da0073e9SAndroid Build Coastguard Worker          "ld $11, 64(%1)\n\t"                                     \
6585*da0073e9SAndroid Build Coastguard Worker          "ld $25, 0(%1)\n\t"  /* target->t9 */                    \
6586*da0073e9SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_T9                                 \
6587*da0073e9SAndroid Build Coastguard Worker          "daddu $29, $29, 32\n\t"                                 \
6588*da0073e9SAndroid Build Coastguard Worker          "move %0, $2\n"                                          \
6589*da0073e9SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
6590*da0073e9SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
6591*da0073e9SAndroid Build Coastguard Worker          : /*trash*/ "memory", __CALLER_SAVED_REGS                \
6592*da0073e9SAndroid Build Coastguard Worker       );                                                          \
6593*da0073e9SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) (long)_res;                       \
6594*da0073e9SAndroid Build Coastguard Worker    } while (0)
6595*da0073e9SAndroid Build Coastguard Worker 
6596*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_mips64_linux */
6597*da0073e9SAndroid Build Coastguard Worker 
6598*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
6599*da0073e9SAndroid Build Coastguard Worker /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS.               */
6600*da0073e9SAndroid Build Coastguard Worker /*                                                                    */
6601*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
6602*da0073e9SAndroid Build Coastguard Worker 
6603*da0073e9SAndroid Build Coastguard Worker /* Some request codes.  There are many more of these, but most are not
6604*da0073e9SAndroid Build Coastguard Worker    exposed to end-user view.  These are the public ones, all of the
6605*da0073e9SAndroid Build Coastguard Worker    form 0x1000 + small_number.
6606*da0073e9SAndroid Build Coastguard Worker 
6607*da0073e9SAndroid Build Coastguard Worker    Core ones are in the range 0x00000000--0x0000ffff.  The non-public
6608*da0073e9SAndroid Build Coastguard Worker    ones start at 0x2000.
6609*da0073e9SAndroid Build Coastguard Worker */
6610*da0073e9SAndroid Build Coastguard Worker 
6611*da0073e9SAndroid Build Coastguard Worker /* These macros are used by tools -- they must be public, but don't
6612*da0073e9SAndroid Build Coastguard Worker    embed them into other programs. */
6613*da0073e9SAndroid Build Coastguard Worker #define VG_USERREQ_TOOL_BASE(a,b) \
6614*da0073e9SAndroid Build Coastguard Worker    ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
6615*da0073e9SAndroid Build Coastguard Worker #define VG_IS_TOOL_USERREQ(a, b, v) \
6616*da0073e9SAndroid Build Coastguard Worker    (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
6617*da0073e9SAndroid Build Coastguard Worker 
6618*da0073e9SAndroid Build Coastguard Worker /* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
6619*da0073e9SAndroid Build Coastguard Worker    This enum comprises an ABI exported by Valgrind to programs
6620*da0073e9SAndroid Build Coastguard Worker    which use client requests.  DO NOT CHANGE THE NUMERIC VALUES OF THESE
6621*da0073e9SAndroid Build Coastguard Worker    ENTRIES, NOR DELETE ANY -- add new ones at the end of the most
6622*da0073e9SAndroid Build Coastguard Worker    relevant group. */
6623*da0073e9SAndroid Build Coastguard Worker typedef
6624*da0073e9SAndroid Build Coastguard Worker    enum { VG_USERREQ__RUNNING_ON_VALGRIND  = 0x1001,
6625*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
6626*da0073e9SAndroid Build Coastguard Worker 
6627*da0073e9SAndroid Build Coastguard Worker           /* These allow any function to be called from the simulated
6628*da0073e9SAndroid Build Coastguard Worker              CPU but run on the real CPU.  Nb: the first arg passed to
6629*da0073e9SAndroid Build Coastguard Worker              the function is always the ThreadId of the running
6630*da0073e9SAndroid Build Coastguard Worker              thread!  So CLIENT_CALL0 actually requires a 1 arg
6631*da0073e9SAndroid Build Coastguard Worker              function, etc. */
6632*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__CLIENT_CALL0 = 0x1101,
6633*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__CLIENT_CALL1 = 0x1102,
6634*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__CLIENT_CALL2 = 0x1103,
6635*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__CLIENT_CALL3 = 0x1104,
6636*da0073e9SAndroid Build Coastguard Worker 
6637*da0073e9SAndroid Build Coastguard Worker           /* Can be useful in regression testing suites -- eg. can
6638*da0073e9SAndroid Build Coastguard Worker              send Valgrind's output to /dev/null and still count
6639*da0073e9SAndroid Build Coastguard Worker              errors. */
6640*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__COUNT_ERRORS = 0x1201,
6641*da0073e9SAndroid Build Coastguard Worker 
6642*da0073e9SAndroid Build Coastguard Worker           /* Allows the client program and/or gdbserver to execute a monitor
6643*da0073e9SAndroid Build Coastguard Worker              command. */
6644*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202,
6645*da0073e9SAndroid Build Coastguard Worker 
6646*da0073e9SAndroid Build Coastguard Worker           /* Allows the client program to change a dynamic command line
6647*da0073e9SAndroid Build Coastguard Worker              option.  */
6648*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__CLO_CHANGE = 0x1203,
6649*da0073e9SAndroid Build Coastguard Worker 
6650*da0073e9SAndroid Build Coastguard Worker           /* These are useful and can be interpreted by any tool that
6651*da0073e9SAndroid Build Coastguard Worker              tracks malloc() et al, by using vg_replace_malloc.c. */
6652*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
6653*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__RESIZEINPLACE_BLOCK = 0x130b,
6654*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__FREELIKE_BLOCK   = 0x1302,
6655*da0073e9SAndroid Build Coastguard Worker           /* Memory pool support. */
6656*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__CREATE_MEMPOOL   = 0x1303,
6657*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__DESTROY_MEMPOOL  = 0x1304,
6658*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_ALLOC    = 0x1305,
6659*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_FREE     = 0x1306,
6660*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_TRIM     = 0x1307,
6661*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__MOVE_MEMPOOL     = 0x1308,
6662*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_CHANGE   = 0x1309,
6663*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_EXISTS   = 0x130a,
6664*da0073e9SAndroid Build Coastguard Worker 
6665*da0073e9SAndroid Build Coastguard Worker           /* Allow printfs to valgrind log. */
6666*da0073e9SAndroid Build Coastguard Worker           /* The first two pass the va_list argument by value, which
6667*da0073e9SAndroid Build Coastguard Worker              assumes it is the same size as or smaller than a UWord,
6668*da0073e9SAndroid Build Coastguard Worker              which generally isn't the case.  Hence are deprecated.
6669*da0073e9SAndroid Build Coastguard Worker              The second two pass the vargs by reference and so are
6670*da0073e9SAndroid Build Coastguard Worker              immune to this problem. */
6671*da0073e9SAndroid Build Coastguard Worker           /* both :: char* fmt, va_list vargs (DEPRECATED) */
6672*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__PRINTF           = 0x1401,
6673*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
6674*da0073e9SAndroid Build Coastguard Worker           /* both :: char* fmt, va_list* vargs */
6675*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403,
6676*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404,
6677*da0073e9SAndroid Build Coastguard Worker 
6678*da0073e9SAndroid Build Coastguard Worker           /* Stack support. */
6679*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__STACK_REGISTER   = 0x1501,
6680*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__STACK_DEREGISTER = 0x1502,
6681*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__STACK_CHANGE     = 0x1503,
6682*da0073e9SAndroid Build Coastguard Worker 
6683*da0073e9SAndroid Build Coastguard Worker           /* Wine support */
6684*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601,
6685*da0073e9SAndroid Build Coastguard Worker 
6686*da0073e9SAndroid Build Coastguard Worker           /* Querying of debug info. */
6687*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701,
6688*da0073e9SAndroid Build Coastguard Worker 
6689*da0073e9SAndroid Build Coastguard Worker           /* Disable/enable error reporting level.  Takes a single
6690*da0073e9SAndroid Build Coastguard Worker              Word arg which is the delta to this thread's error
6691*da0073e9SAndroid Build Coastguard Worker              disablement indicator.  Hence 1 disables or further
6692*da0073e9SAndroid Build Coastguard Worker              disables errors, and -1 moves back towards enablement.
6693*da0073e9SAndroid Build Coastguard Worker              Other values are not allowed. */
6694*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801,
6695*da0073e9SAndroid Build Coastguard Worker 
6696*da0073e9SAndroid Build Coastguard Worker           /* Some requests used for Valgrind internal, such as
6697*da0073e9SAndroid Build Coastguard Worker              self-test or self-hosting. */
6698*da0073e9SAndroid Build Coastguard Worker           /* Initialise IR injection */
6699*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901,
6700*da0073e9SAndroid Build Coastguard Worker           /* Used by Inner Valgrind to inform Outer Valgrind where to
6701*da0073e9SAndroid Build Coastguard Worker              find the list of inner guest threads */
6702*da0073e9SAndroid Build Coastguard Worker           VG_USERREQ__INNER_THREADS    = 0x1902
6703*da0073e9SAndroid Build Coastguard Worker    } Vg_ClientRequest;
6704*da0073e9SAndroid Build Coastguard Worker 
6705*da0073e9SAndroid Build Coastguard Worker #if !defined(__GNUC__)
6706*da0073e9SAndroid Build Coastguard Worker #  define __extension__ /* */
6707*da0073e9SAndroid Build Coastguard Worker #endif
6708*da0073e9SAndroid Build Coastguard Worker 
6709*da0073e9SAndroid Build Coastguard Worker 
6710*da0073e9SAndroid Build Coastguard Worker /* Returns the number of Valgrinds this code is running under.  That
6711*da0073e9SAndroid Build Coastguard Worker    is, 0 if running natively, 1 if running under Valgrind, 2 if
6712*da0073e9SAndroid Build Coastguard Worker    running under Valgrind which is running under another Valgrind,
6713*da0073e9SAndroid Build Coastguard Worker    etc. */
6714*da0073e9SAndroid Build Coastguard Worker #define RUNNING_ON_VALGRIND                                           \
6715*da0073e9SAndroid Build Coastguard Worker     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */,         \
6716*da0073e9SAndroid Build Coastguard Worker                                     VG_USERREQ__RUNNING_ON_VALGRIND,  \
6717*da0073e9SAndroid Build Coastguard Worker                                     0, 0, 0, 0, 0)                    \
6718*da0073e9SAndroid Build Coastguard Worker 
6719*da0073e9SAndroid Build Coastguard Worker 
6720*da0073e9SAndroid Build Coastguard Worker /* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
6721*da0073e9SAndroid Build Coastguard Worker    _qzz_len - 1].  Useful if you are debugging a JITter or some such,
6722*da0073e9SAndroid Build Coastguard Worker    since it provides a way to make sure valgrind will retranslate the
6723*da0073e9SAndroid Build Coastguard Worker    invalidated area.  Returns no value. */
6724*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len)              \
6725*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS,  \
6726*da0073e9SAndroid Build Coastguard Worker                                     _qzz_addr, _qzz_len, 0, 0, 0)
6727*da0073e9SAndroid Build Coastguard Worker 
6728*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_INNER_THREADS(_qzz_addr)                               \
6729*da0073e9SAndroid Build Coastguard Worker    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__INNER_THREADS,           \
6730*da0073e9SAndroid Build Coastguard Worker                                    _qzz_addr, 0, 0, 0, 0)
6731*da0073e9SAndroid Build Coastguard Worker 
6732*da0073e9SAndroid Build Coastguard Worker 
6733*da0073e9SAndroid Build Coastguard Worker /* These requests are for getting Valgrind itself to print something.
6734*da0073e9SAndroid Build Coastguard Worker    Possibly with a backtrace.  This is a really ugly hack.  The return value
6735*da0073e9SAndroid Build Coastguard Worker    is the number of characters printed, excluding the "**<pid>** " part at the
6736*da0073e9SAndroid Build Coastguard Worker    start and the backtrace (if present). */
6737*da0073e9SAndroid Build Coastguard Worker 
6738*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
6739*da0073e9SAndroid Build Coastguard Worker /* Modern GCC will optimize the static routine out if unused,
6740*da0073e9SAndroid Build Coastguard Worker    and unused attribute will shut down warnings about it.  */
6741*da0073e9SAndroid Build Coastguard Worker static int VALGRIND_PRINTF(const char *format, ...)
6742*da0073e9SAndroid Build Coastguard Worker    __attribute__((format(__printf__, 1, 2), __unused__));
6743*da0073e9SAndroid Build Coastguard Worker #endif
6744*da0073e9SAndroid Build Coastguard Worker static int
6745*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER)
6746*da0073e9SAndroid Build Coastguard Worker __inline
6747*da0073e9SAndroid Build Coastguard Worker #endif
VALGRIND_PRINTF(const char * format,...)6748*da0073e9SAndroid Build Coastguard Worker VALGRIND_PRINTF(const char *format, ...)
6749*da0073e9SAndroid Build Coastguard Worker {
6750*da0073e9SAndroid Build Coastguard Worker #if defined(NVALGRIND)
6751*da0073e9SAndroid Build Coastguard Worker    (void)format;
6752*da0073e9SAndroid Build Coastguard Worker    return 0;
6753*da0073e9SAndroid Build Coastguard Worker #else /* NVALGRIND */
6754*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW64__)
6755*da0073e9SAndroid Build Coastguard Worker    uintptr_t _qzz_res;
6756*da0073e9SAndroid Build Coastguard Worker #else
6757*da0073e9SAndroid Build Coastguard Worker    unsigned long _qzz_res;
6758*da0073e9SAndroid Build Coastguard Worker #endif
6759*da0073e9SAndroid Build Coastguard Worker    va_list vargs;
6760*da0073e9SAndroid Build Coastguard Worker    va_start(vargs, format);
6761*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW64__)
6762*da0073e9SAndroid Build Coastguard Worker    _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6763*da0073e9SAndroid Build Coastguard Worker                               VG_USERREQ__PRINTF_VALIST_BY_REF,
6764*da0073e9SAndroid Build Coastguard Worker                               (uintptr_t)format,
6765*da0073e9SAndroid Build Coastguard Worker                               (uintptr_t)&vargs,
6766*da0073e9SAndroid Build Coastguard Worker                               0, 0, 0);
6767*da0073e9SAndroid Build Coastguard Worker #else
6768*da0073e9SAndroid Build Coastguard Worker    _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6769*da0073e9SAndroid Build Coastguard Worker                               VG_USERREQ__PRINTF_VALIST_BY_REF,
6770*da0073e9SAndroid Build Coastguard Worker                               (unsigned long)format,
6771*da0073e9SAndroid Build Coastguard Worker                               (unsigned long)&vargs,
6772*da0073e9SAndroid Build Coastguard Worker                               0, 0, 0);
6773*da0073e9SAndroid Build Coastguard Worker #endif
6774*da0073e9SAndroid Build Coastguard Worker    va_end(vargs);
6775*da0073e9SAndroid Build Coastguard Worker    return (int)_qzz_res;
6776*da0073e9SAndroid Build Coastguard Worker #endif /* NVALGRIND */
6777*da0073e9SAndroid Build Coastguard Worker }
6778*da0073e9SAndroid Build Coastguard Worker 
6779*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
6780*da0073e9SAndroid Build Coastguard Worker static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
6781*da0073e9SAndroid Build Coastguard Worker    __attribute__((format(__printf__, 1, 2), __unused__));
6782*da0073e9SAndroid Build Coastguard Worker #endif
6783*da0073e9SAndroid Build Coastguard Worker static int
6784*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER)
6785*da0073e9SAndroid Build Coastguard Worker __inline
6786*da0073e9SAndroid Build Coastguard Worker #endif
VALGRIND_PRINTF_BACKTRACE(const char * format,...)6787*da0073e9SAndroid Build Coastguard Worker VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
6788*da0073e9SAndroid Build Coastguard Worker {
6789*da0073e9SAndroid Build Coastguard Worker #if defined(NVALGRIND)
6790*da0073e9SAndroid Build Coastguard Worker    (void)format;
6791*da0073e9SAndroid Build Coastguard Worker    return 0;
6792*da0073e9SAndroid Build Coastguard Worker #else /* NVALGRIND */
6793*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW64__)
6794*da0073e9SAndroid Build Coastguard Worker    uintptr_t _qzz_res;
6795*da0073e9SAndroid Build Coastguard Worker #else
6796*da0073e9SAndroid Build Coastguard Worker    unsigned long _qzz_res;
6797*da0073e9SAndroid Build Coastguard Worker #endif
6798*da0073e9SAndroid Build Coastguard Worker    va_list vargs;
6799*da0073e9SAndroid Build Coastguard Worker    va_start(vargs, format);
6800*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW64__)
6801*da0073e9SAndroid Build Coastguard Worker    _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6802*da0073e9SAndroid Build Coastguard Worker                               VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
6803*da0073e9SAndroid Build Coastguard Worker                               (uintptr_t)format,
6804*da0073e9SAndroid Build Coastguard Worker                               (uintptr_t)&vargs,
6805*da0073e9SAndroid Build Coastguard Worker                               0, 0, 0);
6806*da0073e9SAndroid Build Coastguard Worker #else
6807*da0073e9SAndroid Build Coastguard Worker    _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6808*da0073e9SAndroid Build Coastguard Worker                               VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
6809*da0073e9SAndroid Build Coastguard Worker                               (unsigned long)format,
6810*da0073e9SAndroid Build Coastguard Worker                               (unsigned long)&vargs,
6811*da0073e9SAndroid Build Coastguard Worker                               0, 0, 0);
6812*da0073e9SAndroid Build Coastguard Worker #endif
6813*da0073e9SAndroid Build Coastguard Worker    va_end(vargs);
6814*da0073e9SAndroid Build Coastguard Worker    return (int)_qzz_res;
6815*da0073e9SAndroid Build Coastguard Worker #endif /* NVALGRIND */
6816*da0073e9SAndroid Build Coastguard Worker }
6817*da0073e9SAndroid Build Coastguard Worker 
6818*da0073e9SAndroid Build Coastguard Worker 
6819*da0073e9SAndroid Build Coastguard Worker /* These requests allow control to move from the simulated CPU to the
6820*da0073e9SAndroid Build Coastguard Worker    real CPU, calling an arbitrary function.
6821*da0073e9SAndroid Build Coastguard Worker 
6822*da0073e9SAndroid Build Coastguard Worker    Note that the current ThreadId is inserted as the first argument.
6823*da0073e9SAndroid Build Coastguard Worker    So this call:
6824*da0073e9SAndroid Build Coastguard Worker 
6825*da0073e9SAndroid Build Coastguard Worker      VALGRIND_NON_SIMD_CALL2(f, arg1, arg2)
6826*da0073e9SAndroid Build Coastguard Worker 
6827*da0073e9SAndroid Build Coastguard Worker    requires f to have this signature:
6828*da0073e9SAndroid Build Coastguard Worker 
6829*da0073e9SAndroid Build Coastguard Worker      Word f(Word tid, Word arg1, Word arg2)
6830*da0073e9SAndroid Build Coastguard Worker 
6831*da0073e9SAndroid Build Coastguard Worker    where "Word" is a word-sized type.
6832*da0073e9SAndroid Build Coastguard Worker 
6833*da0073e9SAndroid Build Coastguard Worker    Note that these client requests are not entirely reliable.  For example,
6834*da0073e9SAndroid Build Coastguard Worker    if you call a function with them that subsequently calls printf(),
6835*da0073e9SAndroid Build Coastguard Worker    there's a high chance Valgrind will crash.  Generally, your prospects of
6836*da0073e9SAndroid Build Coastguard Worker    these working are made higher if the called function does not refer to
6837*da0073e9SAndroid Build Coastguard Worker    any global variables, and does not refer to any libc or other functions
6838*da0073e9SAndroid Build Coastguard Worker    (printf et al).  Any kind of entanglement with libc or dynamic linking is
6839*da0073e9SAndroid Build Coastguard Worker    likely to have a bad outcome, for tricky reasons which we've grappled
6840*da0073e9SAndroid Build Coastguard Worker    with a lot in the past.
6841*da0073e9SAndroid Build Coastguard Worker */
6842*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL0(_qyy_fn)                          \
6843*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,       \
6844*da0073e9SAndroid Build Coastguard Worker                                     VG_USERREQ__CLIENT_CALL0,     \
6845*da0073e9SAndroid Build Coastguard Worker                                     _qyy_fn,                      \
6846*da0073e9SAndroid Build Coastguard Worker                                     0, 0, 0, 0)
6847*da0073e9SAndroid Build Coastguard Worker 
6848*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1)                    \
6849*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,            \
6850*da0073e9SAndroid Build Coastguard Worker                                     VG_USERREQ__CLIENT_CALL1,          \
6851*da0073e9SAndroid Build Coastguard Worker                                     _qyy_fn,                           \
6852*da0073e9SAndroid Build Coastguard Worker                                     _qyy_arg1, 0, 0, 0)
6853*da0073e9SAndroid Build Coastguard Worker 
6854*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2)         \
6855*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,            \
6856*da0073e9SAndroid Build Coastguard Worker                                     VG_USERREQ__CLIENT_CALL2,          \
6857*da0073e9SAndroid Build Coastguard Worker                                     _qyy_fn,                           \
6858*da0073e9SAndroid Build Coastguard Worker                                     _qyy_arg1, _qyy_arg2, 0, 0)
6859*da0073e9SAndroid Build Coastguard Worker 
6860*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
6861*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,             \
6862*da0073e9SAndroid Build Coastguard Worker                                     VG_USERREQ__CLIENT_CALL3,           \
6863*da0073e9SAndroid Build Coastguard Worker                                     _qyy_fn,                            \
6864*da0073e9SAndroid Build Coastguard Worker                                     _qyy_arg1, _qyy_arg2,               \
6865*da0073e9SAndroid Build Coastguard Worker                                     _qyy_arg3, 0)
6866*da0073e9SAndroid Build Coastguard Worker 
6867*da0073e9SAndroid Build Coastguard Worker 
6868*da0073e9SAndroid Build Coastguard Worker /* Counts the number of errors that have been recorded by a tool.  Nb:
6869*da0073e9SAndroid Build Coastguard Worker    the tool must record the errors with VG_(maybe_record_error)() or
6870*da0073e9SAndroid Build Coastguard Worker    VG_(unique_error)() for them to be counted. */
6871*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_COUNT_ERRORS                                     \
6872*da0073e9SAndroid Build Coastguard Worker     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(                    \
6873*da0073e9SAndroid Build Coastguard Worker                                0 /* default return */,            \
6874*da0073e9SAndroid Build Coastguard Worker                                VG_USERREQ__COUNT_ERRORS,          \
6875*da0073e9SAndroid Build Coastguard Worker                                0, 0, 0, 0, 0)
6876*da0073e9SAndroid Build Coastguard Worker 
6877*da0073e9SAndroid Build Coastguard Worker /* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing
6878*da0073e9SAndroid Build Coastguard Worker    when heap blocks are allocated in order to give accurate results.  This
6879*da0073e9SAndroid Build Coastguard Worker    happens automatically for the standard allocator functions such as
6880*da0073e9SAndroid Build Coastguard Worker    malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete,
6881*da0073e9SAndroid Build Coastguard Worker    delete[], etc.
6882*da0073e9SAndroid Build Coastguard Worker 
6883*da0073e9SAndroid Build Coastguard Worker    But if your program uses a custom allocator, this doesn't automatically
6884*da0073e9SAndroid Build Coastguard Worker    happen, and Valgrind will not do as well.  For example, if you allocate
6885*da0073e9SAndroid Build Coastguard Worker    superblocks with mmap() and then allocates chunks of the superblocks, all
6886*da0073e9SAndroid Build Coastguard Worker    Valgrind's observations will be at the mmap() level and it won't know that
6887*da0073e9SAndroid Build Coastguard Worker    the chunks should be considered separate entities.  In Memcheck's case,
6888*da0073e9SAndroid Build Coastguard Worker    that means you probably won't get heap block overrun detection (because
6889*da0073e9SAndroid Build Coastguard Worker    there won't be redzones marked as unaddressable) and you definitely won't
6890*da0073e9SAndroid Build Coastguard Worker    get any leak detection.
6891*da0073e9SAndroid Build Coastguard Worker 
6892*da0073e9SAndroid Build Coastguard Worker    The following client requests allow a custom allocator to be annotated so
6893*da0073e9SAndroid Build Coastguard Worker    that it can be handled accurately by Valgrind.
6894*da0073e9SAndroid Build Coastguard Worker 
6895*da0073e9SAndroid Build Coastguard Worker    VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated
6896*da0073e9SAndroid Build Coastguard Worker    by a malloc()-like function.  For Memcheck (an illustrative case), this
6897*da0073e9SAndroid Build Coastguard Worker    does two things:
6898*da0073e9SAndroid Build Coastguard Worker 
6899*da0073e9SAndroid Build Coastguard Worker    - It records that the block has been allocated.  This means any addresses
6900*da0073e9SAndroid Build Coastguard Worker      within the block mentioned in error messages will be
6901*da0073e9SAndroid Build Coastguard Worker      identified as belonging to the block.  It also means that if the block
6902*da0073e9SAndroid Build Coastguard Worker      isn't freed it will be detected by the leak checker.
6903*da0073e9SAndroid Build Coastguard Worker 
6904*da0073e9SAndroid Build Coastguard Worker    - It marks the block as being addressable and undefined (if 'is_zeroed' is
6905*da0073e9SAndroid Build Coastguard Worker      not set), or addressable and defined (if 'is_zeroed' is set).  This
6906*da0073e9SAndroid Build Coastguard Worker      controls how accesses to the block by the program are handled.
6907*da0073e9SAndroid Build Coastguard Worker 
6908*da0073e9SAndroid Build Coastguard Worker    'addr' is the start of the usable block (ie. after any
6909*da0073e9SAndroid Build Coastguard Worker    redzone), 'sizeB' is its size.  'rzB' is the redzone size if the allocator
6910*da0073e9SAndroid Build Coastguard Worker    can apply redzones -- these are blocks of padding at the start and end of
6911*da0073e9SAndroid Build Coastguard Worker    each block.  Adding redzones is recommended as it makes it much more likely
6912*da0073e9SAndroid Build Coastguard Worker    Valgrind will spot block overruns.  `is_zeroed' indicates if the memory is
6913*da0073e9SAndroid Build Coastguard Worker    zeroed (or filled with another predictable value), as is the case for
6914*da0073e9SAndroid Build Coastguard Worker    calloc().
6915*da0073e9SAndroid Build Coastguard Worker 
6916*da0073e9SAndroid Build Coastguard Worker    VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a
6917*da0073e9SAndroid Build Coastguard Worker    heap block -- that will be used by the client program -- is allocated.
6918*da0073e9SAndroid Build Coastguard Worker    It's best to put it at the outermost level of the allocator if possible;
6919*da0073e9SAndroid Build Coastguard Worker    for example, if you have a function my_alloc() which calls
6920*da0073e9SAndroid Build Coastguard Worker    internal_alloc(), and the client request is put inside internal_alloc(),
6921*da0073e9SAndroid Build Coastguard Worker    stack traces relating to the heap block will contain entries for both
6922*da0073e9SAndroid Build Coastguard Worker    my_alloc() and internal_alloc(), which is probably not what you want.
6923*da0073e9SAndroid Build Coastguard Worker 
6924*da0073e9SAndroid Build Coastguard Worker    For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out
6925*da0073e9SAndroid Build Coastguard Worker    custom blocks from within a heap block, B, that has been allocated with
6926*da0073e9SAndroid Build Coastguard Worker    malloc/calloc/new/etc, then block B will be *ignored* during leak-checking
6927*da0073e9SAndroid Build Coastguard Worker    -- the custom blocks will take precedence.
6928*da0073e9SAndroid Build Coastguard Worker 
6929*da0073e9SAndroid Build Coastguard Worker    VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK.  For
6930*da0073e9SAndroid Build Coastguard Worker    Memcheck, it does two things:
6931*da0073e9SAndroid Build Coastguard Worker 
6932*da0073e9SAndroid Build Coastguard Worker    - It records that the block has been deallocated.  This assumes that the
6933*da0073e9SAndroid Build Coastguard Worker      block was annotated as having been allocated via
6934*da0073e9SAndroid Build Coastguard Worker      VALGRIND_MALLOCLIKE_BLOCK.  Otherwise, an error will be issued.
6935*da0073e9SAndroid Build Coastguard Worker 
6936*da0073e9SAndroid Build Coastguard Worker    - It marks the block as being unaddressable.
6937*da0073e9SAndroid Build Coastguard Worker 
6938*da0073e9SAndroid Build Coastguard Worker    VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a
6939*da0073e9SAndroid Build Coastguard Worker    heap block is deallocated.
6940*da0073e9SAndroid Build Coastguard Worker 
6941*da0073e9SAndroid Build Coastguard Worker    VALGRIND_RESIZEINPLACE_BLOCK informs a tool about reallocation. For
6942*da0073e9SAndroid Build Coastguard Worker    Memcheck, it does four things:
6943*da0073e9SAndroid Build Coastguard Worker 
6944*da0073e9SAndroid Build Coastguard Worker    - It records that the size of a block has been changed.  This assumes that
6945*da0073e9SAndroid Build Coastguard Worker      the block was annotated as having been allocated via
6946*da0073e9SAndroid Build Coastguard Worker      VALGRIND_MALLOCLIKE_BLOCK.  Otherwise, an error will be issued.
6947*da0073e9SAndroid Build Coastguard Worker 
6948*da0073e9SAndroid Build Coastguard Worker    - If the block shrunk, it marks the freed memory as being unaddressable.
6949*da0073e9SAndroid Build Coastguard Worker 
6950*da0073e9SAndroid Build Coastguard Worker    - If the block grew, it marks the new area as undefined and defines a red
6951*da0073e9SAndroid Build Coastguard Worker      zone past the end of the new block.
6952*da0073e9SAndroid Build Coastguard Worker 
6953*da0073e9SAndroid Build Coastguard Worker    - The V-bits of the overlap between the old and the new block are preserved.
6954*da0073e9SAndroid Build Coastguard Worker 
6955*da0073e9SAndroid Build Coastguard Worker    VALGRIND_RESIZEINPLACE_BLOCK should be put after allocation of the new block
6956*da0073e9SAndroid Build Coastguard Worker    and before deallocation of the old block.
6957*da0073e9SAndroid Build Coastguard Worker 
6958*da0073e9SAndroid Build Coastguard Worker    In many cases, these three client requests will not be enough to get your
6959*da0073e9SAndroid Build Coastguard Worker    allocator working well with Memcheck.  More specifically, if your allocator
6960*da0073e9SAndroid Build Coastguard Worker    writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call
6961*da0073e9SAndroid Build Coastguard Worker    will be necessary to mark the memory as addressable just before the zeroing
6962*da0073e9SAndroid Build Coastguard Worker    occurs, otherwise you'll get a lot of invalid write errors.  For example,
6963*da0073e9SAndroid Build Coastguard Worker    you'll need to do this if your allocator recycles freed blocks, but it
6964*da0073e9SAndroid Build Coastguard Worker    zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK).
6965*da0073e9SAndroid Build Coastguard Worker    Alternatively, if your allocator reuses freed blocks for allocator-internal
6966*da0073e9SAndroid Build Coastguard Worker    data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary.
6967*da0073e9SAndroid Build Coastguard Worker 
6968*da0073e9SAndroid Build Coastguard Worker    Really, what's happening is a blurring of the lines between the client
6969*da0073e9SAndroid Build Coastguard Worker    program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the
6970*da0073e9SAndroid Build Coastguard Worker    memory should be considered unaddressable to the client program, but the
6971*da0073e9SAndroid Build Coastguard Worker    allocator knows more than the rest of the client program and so may be able
6972*da0073e9SAndroid Build Coastguard Worker    to safely access it.  Extra client requests are necessary for Valgrind to
6973*da0073e9SAndroid Build Coastguard Worker    understand the distinction between the allocator and the rest of the
6974*da0073e9SAndroid Build Coastguard Worker    program.
6975*da0073e9SAndroid Build Coastguard Worker 
6976*da0073e9SAndroid Build Coastguard Worker    Ignored if addr == 0.
6977*da0073e9SAndroid Build Coastguard Worker */
6978*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)          \
6979*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK,       \
6980*da0073e9SAndroid Build Coastguard Worker                                     addr, sizeB, rzB, is_zeroed, 0)
6981*da0073e9SAndroid Build Coastguard Worker 
6982*da0073e9SAndroid Build Coastguard Worker /* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
6983*da0073e9SAndroid Build Coastguard Worker    Ignored if addr == 0.
6984*da0073e9SAndroid Build Coastguard Worker */
6985*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB)     \
6986*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK,    \
6987*da0073e9SAndroid Build Coastguard Worker                                     addr, oldSizeB, newSizeB, rzB, 0)
6988*da0073e9SAndroid Build Coastguard Worker 
6989*da0073e9SAndroid Build Coastguard Worker /* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
6990*da0073e9SAndroid Build Coastguard Worker    Ignored if addr == 0.
6991*da0073e9SAndroid Build Coastguard Worker */
6992*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_FREELIKE_BLOCK(addr, rzB)                              \
6993*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK,         \
6994*da0073e9SAndroid Build Coastguard Worker                                     addr, rzB, 0, 0, 0)
6995*da0073e9SAndroid Build Coastguard Worker 
6996*da0073e9SAndroid Build Coastguard Worker /* Create a memory pool. */
6997*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed)             \
6998*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL,   \
6999*da0073e9SAndroid Build Coastguard Worker                                     pool, rzB, is_zeroed, 0, 0)
7000*da0073e9SAndroid Build Coastguard Worker 
7001*da0073e9SAndroid Build Coastguard Worker /* Create a memory pool with some flags specifying extended behaviour.
7002*da0073e9SAndroid Build Coastguard Worker    When flags is zero, the behaviour is identical to VALGRIND_CREATE_MEMPOOL.
7003*da0073e9SAndroid Build Coastguard Worker 
7004*da0073e9SAndroid Build Coastguard Worker    The flag VALGRIND_MEMPOOL_METAPOOL specifies that the pieces of memory
7005*da0073e9SAndroid Build Coastguard Worker    associated with the pool using VALGRIND_MEMPOOL_ALLOC  will be used
7006*da0073e9SAndroid Build Coastguard Worker    by the application as superblocks to dole out MALLOC_LIKE blocks using
7007*da0073e9SAndroid Build Coastguard Worker    VALGRIND_MALLOCLIKE_BLOCK. In other words, a meta pool is a "2 levels"
7008*da0073e9SAndroid Build Coastguard Worker    pool : first level is the blocks described by VALGRIND_MEMPOOL_ALLOC.
7009*da0073e9SAndroid Build Coastguard Worker    The second level blocks are described using VALGRIND_MALLOCLIKE_BLOCK.
7010*da0073e9SAndroid Build Coastguard Worker    Note that the association between the pool and the second level blocks
7011*da0073e9SAndroid Build Coastguard Worker    is implicit : second level blocks will be located inside first level
7012*da0073e9SAndroid Build Coastguard Worker    blocks. It is necessary to use the VALGRIND_MEMPOOL_METAPOOL flag
7013*da0073e9SAndroid Build Coastguard Worker    for such 2 levels pools, as otherwise valgrind will detect overlapping
7014*da0073e9SAndroid Build Coastguard Worker    memory blocks, and will abort execution (e.g. during leak search).
7015*da0073e9SAndroid Build Coastguard Worker 
7016*da0073e9SAndroid Build Coastguard Worker    Such a meta pool can also be marked as an 'auto free' pool using the flag
7017*da0073e9SAndroid Build Coastguard Worker    VALGRIND_MEMPOOL_AUTO_FREE, which must be OR-ed together with the
7018*da0073e9SAndroid Build Coastguard Worker    VALGRIND_MEMPOOL_METAPOOL. For an 'auto free' pool, VALGRIND_MEMPOOL_FREE
7019*da0073e9SAndroid Build Coastguard Worker    will automatically free the second level blocks that are contained
7020*da0073e9SAndroid Build Coastguard Worker    inside the first level block freed with VALGRIND_MEMPOOL_FREE.
7021*da0073e9SAndroid Build Coastguard Worker    In other words, calling VALGRIND_MEMPOOL_FREE will cause implicit calls
7022*da0073e9SAndroid Build Coastguard Worker    to VALGRIND_FREELIKE_BLOCK for all the second level blocks included
7023*da0073e9SAndroid Build Coastguard Worker    in the first level block.
7024*da0073e9SAndroid Build Coastguard Worker    Note: it is an error to use the VALGRIND_MEMPOOL_AUTO_FREE flag
7025*da0073e9SAndroid Build Coastguard Worker    without the VALGRIND_MEMPOOL_METAPOOL flag.
7026*da0073e9SAndroid Build Coastguard Worker */
7027*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_AUTO_FREE  1
7028*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_METAPOOL   2
7029*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CREATE_MEMPOOL_EXT(pool, rzB, is_zeroed, flags)        \
7030*da0073e9SAndroid Build Coastguard Worker    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL,          \
7031*da0073e9SAndroid Build Coastguard Worker                                    pool, rzB, is_zeroed, flags, 0)
7032*da0073e9SAndroid Build Coastguard Worker 
7033*da0073e9SAndroid Build Coastguard Worker /* Destroy a memory pool. */
7034*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DESTROY_MEMPOOL(pool)                            \
7035*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL,  \
7036*da0073e9SAndroid Build Coastguard Worker                                     pool, 0, 0, 0, 0)
7037*da0073e9SAndroid Build Coastguard Worker 
7038*da0073e9SAndroid Build Coastguard Worker /* Associate a piece of memory with a memory pool. */
7039*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size)                  \
7040*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC,    \
7041*da0073e9SAndroid Build Coastguard Worker                                     pool, addr, size, 0, 0)
7042*da0073e9SAndroid Build Coastguard Worker 
7043*da0073e9SAndroid Build Coastguard Worker /* Disassociate a piece of memory from a memory pool. */
7044*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_FREE(pool, addr)                         \
7045*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE,     \
7046*da0073e9SAndroid Build Coastguard Worker                                     pool, addr, 0, 0, 0)
7047*da0073e9SAndroid Build Coastguard Worker 
7048*da0073e9SAndroid Build Coastguard Worker /* Disassociate any pieces outside a particular range. */
7049*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_TRIM(pool, addr, size)                   \
7050*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM,     \
7051*da0073e9SAndroid Build Coastguard Worker                                     pool, addr, size, 0, 0)
7052*da0073e9SAndroid Build Coastguard Worker 
7053*da0073e9SAndroid Build Coastguard Worker /* Resize and/or move a piece associated with a memory pool. */
7054*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MOVE_MEMPOOL(poolA, poolB)                       \
7055*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL,     \
7056*da0073e9SAndroid Build Coastguard Worker                                     poolA, poolB, 0, 0, 0)
7057*da0073e9SAndroid Build Coastguard Worker 
7058*da0073e9SAndroid Build Coastguard Worker /* Resize and/or move a piece associated with a memory pool. */
7059*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size)         \
7060*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE,   \
7061*da0073e9SAndroid Build Coastguard Worker                                     pool, addrA, addrB, size, 0)
7062*da0073e9SAndroid Build Coastguard Worker 
7063*da0073e9SAndroid Build Coastguard Worker /* Return 1 if a mempool exists, else 0. */
7064*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_EXISTS(pool)                             \
7065*da0073e9SAndroid Build Coastguard Worker     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                  \
7066*da0073e9SAndroid Build Coastguard Worker                                VG_USERREQ__MEMPOOL_EXISTS,        \
7067*da0073e9SAndroid Build Coastguard Worker                                pool, 0, 0, 0, 0)
7068*da0073e9SAndroid Build Coastguard Worker 
7069*da0073e9SAndroid Build Coastguard Worker /* Mark a piece of memory as being a stack. Returns a stack id.
7070*da0073e9SAndroid Build Coastguard Worker    start is the lowest addressable stack byte, end is the highest
7071*da0073e9SAndroid Build Coastguard Worker    addressable stack byte. */
7072*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_STACK_REGISTER(start, end)                       \
7073*da0073e9SAndroid Build Coastguard Worker     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                  \
7074*da0073e9SAndroid Build Coastguard Worker                                VG_USERREQ__STACK_REGISTER,        \
7075*da0073e9SAndroid Build Coastguard Worker                                start, end, 0, 0, 0)
7076*da0073e9SAndroid Build Coastguard Worker 
7077*da0073e9SAndroid Build Coastguard Worker /* Unmark the piece of memory associated with a stack id as being a
7078*da0073e9SAndroid Build Coastguard Worker    stack. */
7079*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_STACK_DEREGISTER(id)                             \
7080*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \
7081*da0073e9SAndroid Build Coastguard Worker                                     id, 0, 0, 0, 0)
7082*da0073e9SAndroid Build Coastguard Worker 
7083*da0073e9SAndroid Build Coastguard Worker /* Change the start and end address of the stack id.
7084*da0073e9SAndroid Build Coastguard Worker    start is the new lowest addressable stack byte, end is the new highest
7085*da0073e9SAndroid Build Coastguard Worker    addressable stack byte. */
7086*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_STACK_CHANGE(id, start, end)                     \
7087*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE,     \
7088*da0073e9SAndroid Build Coastguard Worker                                     id, start, end, 0, 0)
7089*da0073e9SAndroid Build Coastguard Worker 
7090*da0073e9SAndroid Build Coastguard Worker /* Load PDB debug info for Wine PE image_map. */
7091*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta)     \
7092*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \
7093*da0073e9SAndroid Build Coastguard Worker                                     fd, ptr, total_size, delta, 0)
7094*da0073e9SAndroid Build Coastguard Worker 
7095*da0073e9SAndroid Build Coastguard Worker /* Map a code address to a source file name and line number.  buf64
7096*da0073e9SAndroid Build Coastguard Worker    must point to a 64-byte buffer in the caller's address space.  The
7097*da0073e9SAndroid Build Coastguard Worker    result will be dumped in there and is guaranteed to be zero
7098*da0073e9SAndroid Build Coastguard Worker    terminated.  If no info is found, the first byte is set to zero. */
7099*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64)                    \
7100*da0073e9SAndroid Build Coastguard Worker     (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                  \
7101*da0073e9SAndroid Build Coastguard Worker                                VG_USERREQ__MAP_IP_TO_SRCLOC,      \
7102*da0073e9SAndroid Build Coastguard Worker                                addr, buf64, 0, 0, 0)
7103*da0073e9SAndroid Build Coastguard Worker 
7104*da0073e9SAndroid Build Coastguard Worker /* Disable error reporting for this thread.  Behaves in a stack like
7105*da0073e9SAndroid Build Coastguard Worker    way, so you can safely call this multiple times provided that
7106*da0073e9SAndroid Build Coastguard Worker    VALGRIND_ENABLE_ERROR_REPORTING is called the same number of times
7107*da0073e9SAndroid Build Coastguard Worker    to re-enable reporting.  The first call of this macro disables
7108*da0073e9SAndroid Build Coastguard Worker    reporting.  Subsequent calls have no effect except to increase the
7109*da0073e9SAndroid Build Coastguard Worker    number of VALGRIND_ENABLE_ERROR_REPORTING calls needed to re-enable
7110*da0073e9SAndroid Build Coastguard Worker    reporting.  Child threads do not inherit this setting from their
7111*da0073e9SAndroid Build Coastguard Worker    parents -- they are always created with reporting enabled. */
7112*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DISABLE_ERROR_REPORTING                                \
7113*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
7114*da0073e9SAndroid Build Coastguard Worker                                     1, 0, 0, 0, 0)
7115*da0073e9SAndroid Build Coastguard Worker 
7116*da0073e9SAndroid Build Coastguard Worker /* Re-enable error reporting, as per comments on
7117*da0073e9SAndroid Build Coastguard Worker    VALGRIND_DISABLE_ERROR_REPORTING. */
7118*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ENABLE_ERROR_REPORTING                                 \
7119*da0073e9SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
7120*da0073e9SAndroid Build Coastguard Worker                                     -1, 0, 0, 0, 0)
7121*da0073e9SAndroid Build Coastguard Worker 
7122*da0073e9SAndroid Build Coastguard Worker /* Execute a monitor command from the client program.
7123*da0073e9SAndroid Build Coastguard Worker    If a connection is opened with GDB, the output will be sent
7124*da0073e9SAndroid Build Coastguard Worker    according to the output mode set for vgdb.
7125*da0073e9SAndroid Build Coastguard Worker    If no connection is opened, output will go to the log output.
7126*da0073e9SAndroid Build Coastguard Worker    Returns 1 if command not recognised, 0 otherwise. */
7127*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MONITOR_COMMAND(command)                               \
7128*da0073e9SAndroid Build Coastguard Worker    VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \
7129*da0073e9SAndroid Build Coastguard Worker                                    command, 0, 0, 0, 0)
7130*da0073e9SAndroid Build Coastguard Worker 
7131*da0073e9SAndroid Build Coastguard Worker 
7132*da0073e9SAndroid Build Coastguard Worker /* Change the value of a dynamic command line option.
7133*da0073e9SAndroid Build Coastguard Worker    Note that unknown or not dynamically changeable options
7134*da0073e9SAndroid Build Coastguard Worker    will cause a warning message to be output.  */
7135*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CLO_CHANGE(option)                           \
7136*da0073e9SAndroid Build Coastguard Worker    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CLO_CHANGE, \
7137*da0073e9SAndroid Build Coastguard Worker                                    option, 0, 0, 0, 0)
7138*da0073e9SAndroid Build Coastguard Worker 
7139*da0073e9SAndroid Build Coastguard Worker 
7140*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_darwin
7141*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_darwin
7142*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_win32
7143*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_win64
7144*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_linux
7145*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_linux
7146*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc32_linux
7147*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc64be_linux
7148*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc64le_linux
7149*da0073e9SAndroid Build Coastguard Worker #undef PLAT_arm_linux
7150*da0073e9SAndroid Build Coastguard Worker #undef PLAT_s390x_linux
7151*da0073e9SAndroid Build Coastguard Worker #undef PLAT_mips32_linux
7152*da0073e9SAndroid Build Coastguard Worker #undef PLAT_mips64_linux
7153*da0073e9SAndroid Build Coastguard Worker #undef PLAT_nanomips_linux
7154*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_solaris
7155*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_solaris
7156*da0073e9SAndroid Build Coastguard Worker 
7157*da0073e9SAndroid Build Coastguard Worker #endif   /* __VALGRIND_H */
7158