xref: /aosp_15_r20/external/libchrome/base/third_party/valgrind/valgrind.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker /* -*- c -*-
2*635a8641SAndroid Build Coastguard Worker    ----------------------------------------------------------------
3*635a8641SAndroid Build Coastguard Worker 
4*635a8641SAndroid Build Coastguard Worker    Notice that the following BSD-style license applies to this one
5*635a8641SAndroid Build Coastguard Worker    file (valgrind.h) only.  The rest of Valgrind is licensed under the
6*635a8641SAndroid Build Coastguard Worker    terms of the GNU General Public License, version 2, unless
7*635a8641SAndroid Build Coastguard Worker    otherwise indicated.  See the COPYING file in the source
8*635a8641SAndroid Build Coastguard Worker    distribution for details.
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker    ----------------------------------------------------------------
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker    This file is part of Valgrind, a dynamic binary instrumentation
13*635a8641SAndroid Build Coastguard Worker    framework.
14*635a8641SAndroid Build Coastguard Worker 
15*635a8641SAndroid Build Coastguard Worker    Copyright (C) 2000-2010 Julian Seward.  All rights reserved.
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker    Redistribution and use in source and binary forms, with or without
18*635a8641SAndroid Build Coastguard Worker    modification, are permitted provided that the following conditions
19*635a8641SAndroid Build Coastguard Worker    are met:
20*635a8641SAndroid Build Coastguard Worker 
21*635a8641SAndroid Build Coastguard Worker    1. Redistributions of source code must retain the above copyright
22*635a8641SAndroid Build Coastguard Worker       notice, this list of conditions and the following disclaimer.
23*635a8641SAndroid Build Coastguard Worker 
24*635a8641SAndroid Build Coastguard Worker    2. The origin of this software must not be misrepresented; you must
25*635a8641SAndroid Build Coastguard Worker       not claim that you wrote the original software.  If you use this
26*635a8641SAndroid Build Coastguard Worker       software in a product, an acknowledgment in the product
27*635a8641SAndroid Build Coastguard Worker       documentation would be appreciated but is not required.
28*635a8641SAndroid Build Coastguard Worker 
29*635a8641SAndroid Build Coastguard Worker    3. Altered source versions must be plainly marked as such, and must
30*635a8641SAndroid Build Coastguard Worker       not be misrepresented as being the original software.
31*635a8641SAndroid Build Coastguard Worker 
32*635a8641SAndroid Build Coastguard Worker    4. The name of the author may not be used to endorse or promote
33*635a8641SAndroid Build Coastguard Worker       products derived from this software without specific prior written
34*635a8641SAndroid Build Coastguard Worker       permission.
35*635a8641SAndroid Build Coastguard Worker 
36*635a8641SAndroid Build Coastguard Worker    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
37*635a8641SAndroid Build Coastguard Worker    OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
38*635a8641SAndroid Build Coastguard Worker    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39*635a8641SAndroid Build Coastguard Worker    ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
40*635a8641SAndroid Build Coastguard Worker    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41*635a8641SAndroid Build Coastguard Worker    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
42*635a8641SAndroid Build Coastguard Worker    GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
43*635a8641SAndroid Build Coastguard Worker    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
44*635a8641SAndroid Build Coastguard Worker    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45*635a8641SAndroid Build Coastguard Worker    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46*635a8641SAndroid Build Coastguard Worker    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker    ----------------------------------------------------------------
49*635a8641SAndroid Build Coastguard Worker 
50*635a8641SAndroid Build Coastguard Worker    Notice that the above BSD-style license applies to this one file
51*635a8641SAndroid Build Coastguard Worker    (valgrind.h) only.  The entire rest of Valgrind is licensed under
52*635a8641SAndroid Build Coastguard Worker    the terms of the GNU General Public License, version 2.  See the
53*635a8641SAndroid Build Coastguard Worker    COPYING file in the source distribution for details.
54*635a8641SAndroid Build Coastguard Worker 
55*635a8641SAndroid Build Coastguard Worker    ----------------------------------------------------------------
56*635a8641SAndroid Build Coastguard Worker */
57*635a8641SAndroid Build Coastguard Worker 
58*635a8641SAndroid Build Coastguard Worker 
59*635a8641SAndroid Build Coastguard Worker /* This file is for inclusion into client (your!) code.
60*635a8641SAndroid Build Coastguard Worker 
61*635a8641SAndroid Build Coastguard Worker    You can use these macros to manipulate and query Valgrind's
62*635a8641SAndroid Build Coastguard Worker    execution inside your own programs.
63*635a8641SAndroid Build Coastguard Worker 
64*635a8641SAndroid Build Coastguard Worker    The resulting executables will still run without Valgrind, just a
65*635a8641SAndroid Build Coastguard Worker    little bit more slowly than they otherwise would, but otherwise
66*635a8641SAndroid Build Coastguard Worker    unchanged.  When not running on valgrind, each client request
67*635a8641SAndroid Build Coastguard Worker    consumes very few (eg. 7) instructions, so the resulting performance
68*635a8641SAndroid Build Coastguard Worker    loss is negligible unless you plan to execute client requests
69*635a8641SAndroid Build Coastguard Worker    millions of times per second.  Nevertheless, if that is still a
70*635a8641SAndroid Build Coastguard Worker    problem, you can compile with the NVALGRIND symbol defined (gcc
71*635a8641SAndroid Build Coastguard Worker    -DNVALGRIND) so that client requests are not even compiled in.  */
72*635a8641SAndroid Build Coastguard Worker 
73*635a8641SAndroid Build Coastguard Worker #ifndef __VALGRIND_H
74*635a8641SAndroid Build Coastguard Worker #define __VALGRIND_H
75*635a8641SAndroid Build Coastguard Worker 
76*635a8641SAndroid Build Coastguard Worker 
77*635a8641SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
78*635a8641SAndroid Build Coastguard Worker /* VERSION NUMBER OF VALGRIND                                         */
79*635a8641SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
80*635a8641SAndroid Build Coastguard Worker 
81*635a8641SAndroid Build Coastguard Worker /* Specify Valgrind's version number, so that user code can
82*635a8641SAndroid Build Coastguard Worker    conditionally compile based on our version number.  Note that these
83*635a8641SAndroid Build Coastguard Worker    were introduced at version 3.6 and so do not exist in version 3.5
84*635a8641SAndroid Build Coastguard Worker    or earlier.  The recommended way to use them to check for "version
85*635a8641SAndroid Build Coastguard Worker    X.Y or later" is (eg)
86*635a8641SAndroid Build Coastguard Worker 
87*635a8641SAndroid Build Coastguard Worker #if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__)   \
88*635a8641SAndroid Build Coastguard Worker     && (__VALGRIND_MAJOR__ > 3                                   \
89*635a8641SAndroid Build Coastguard Worker         || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6))
90*635a8641SAndroid Build Coastguard Worker */
91*635a8641SAndroid Build Coastguard Worker #define __VALGRIND_MAJOR__    3
92*635a8641SAndroid Build Coastguard Worker #define __VALGRIND_MINOR__    6
93*635a8641SAndroid Build Coastguard Worker 
94*635a8641SAndroid Build Coastguard Worker 
95*635a8641SAndroid Build Coastguard Worker #include <stdarg.h>
96*635a8641SAndroid Build Coastguard Worker 
97*635a8641SAndroid Build Coastguard Worker /* Nb: this file might be included in a file compiled with -ansi.  So
98*635a8641SAndroid Build Coastguard Worker    we can't use C++ style "//" comments nor the "asm" keyword (instead
99*635a8641SAndroid Build Coastguard Worker    use "__asm__"). */
100*635a8641SAndroid Build Coastguard Worker 
101*635a8641SAndroid Build Coastguard Worker /* Derive some tags indicating what the target platform is.  Note
102*635a8641SAndroid Build Coastguard Worker    that in this file we're using the compiler's CPP symbols for
103*635a8641SAndroid Build Coastguard Worker    identifying architectures, which are different to the ones we use
104*635a8641SAndroid Build Coastguard Worker    within the rest of Valgrind.  Note, __powerpc__ is active for both
105*635a8641SAndroid Build Coastguard Worker    32 and 64-bit PPC, whereas __powerpc64__ is only active for the
106*635a8641SAndroid Build Coastguard Worker    latter (on Linux, that is).
107*635a8641SAndroid Build Coastguard Worker 
108*635a8641SAndroid Build Coastguard Worker    Misc note: how to find out what's predefined in gcc by default:
109*635a8641SAndroid Build Coastguard Worker    gcc -Wp,-dM somefile.c
110*635a8641SAndroid Build Coastguard Worker */
111*635a8641SAndroid Build Coastguard Worker #undef PLAT_ppc64_aix5
112*635a8641SAndroid Build Coastguard Worker #undef PLAT_ppc32_aix5
113*635a8641SAndroid Build Coastguard Worker #undef PLAT_x86_darwin
114*635a8641SAndroid Build Coastguard Worker #undef PLAT_amd64_darwin
115*635a8641SAndroid Build Coastguard Worker #undef PLAT_x86_win32
116*635a8641SAndroid Build Coastguard Worker #undef PLAT_x86_linux
117*635a8641SAndroid Build Coastguard Worker #undef PLAT_amd64_linux
118*635a8641SAndroid Build Coastguard Worker #undef PLAT_ppc32_linux
119*635a8641SAndroid Build Coastguard Worker #undef PLAT_ppc64_linux
120*635a8641SAndroid Build Coastguard Worker #undef PLAT_arm_linux
121*635a8641SAndroid Build Coastguard Worker 
122*635a8641SAndroid Build Coastguard Worker #if defined(_AIX) && defined(__64BIT__)
123*635a8641SAndroid Build Coastguard Worker #  define PLAT_ppc64_aix5 1
124*635a8641SAndroid Build Coastguard Worker #elif defined(_AIX) && !defined(__64BIT__)
125*635a8641SAndroid Build Coastguard Worker #  define PLAT_ppc32_aix5 1
126*635a8641SAndroid Build Coastguard Worker #elif defined(__APPLE__) && defined(__i386__)
127*635a8641SAndroid Build Coastguard Worker #  define PLAT_x86_darwin 1
128*635a8641SAndroid Build Coastguard Worker #elif defined(__APPLE__) && defined(__x86_64__)
129*635a8641SAndroid Build Coastguard Worker #  define PLAT_amd64_darwin 1
130*635a8641SAndroid Build Coastguard Worker #elif defined(__MINGW32__) || defined(__CYGWIN32__) || defined(_WIN32) && defined(_M_IX86)
131*635a8641SAndroid Build Coastguard Worker #  define PLAT_x86_win32 1
132*635a8641SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__i386__)
133*635a8641SAndroid Build Coastguard Worker #  define PLAT_x86_linux 1
134*635a8641SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__x86_64__)
135*635a8641SAndroid Build Coastguard Worker #  define PLAT_amd64_linux 1
136*635a8641SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
137*635a8641SAndroid Build Coastguard Worker #  define PLAT_ppc32_linux 1
138*635a8641SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__)
139*635a8641SAndroid Build Coastguard Worker #  define PLAT_ppc64_linux 1
140*635a8641SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__arm__)
141*635a8641SAndroid Build Coastguard Worker #  define PLAT_arm_linux 1
142*635a8641SAndroid Build Coastguard Worker #else
143*635a8641SAndroid Build Coastguard Worker /* If we're not compiling for our target platform, don't generate
144*635a8641SAndroid Build Coastguard Worker    any inline asms.  */
145*635a8641SAndroid Build Coastguard Worker #  if !defined(NVALGRIND)
146*635a8641SAndroid Build Coastguard Worker #    define NVALGRIND 1
147*635a8641SAndroid Build Coastguard Worker #  endif
148*635a8641SAndroid Build Coastguard Worker #endif
149*635a8641SAndroid Build Coastguard Worker 
150*635a8641SAndroid Build Coastguard Worker 
151*635a8641SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
152*635a8641SAndroid Build Coastguard Worker /* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS.  There is nothing */
153*635a8641SAndroid Build Coastguard Worker /* in here of use to end-users -- skip to the next section.           */
154*635a8641SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
155*635a8641SAndroid Build Coastguard Worker 
156*635a8641SAndroid Build Coastguard Worker #if defined(NVALGRIND)
157*635a8641SAndroid Build Coastguard Worker 
158*635a8641SAndroid Build Coastguard Worker /* Define NVALGRIND to completely remove the Valgrind magic sequence
159*635a8641SAndroid Build Coastguard Worker    from the compiled code (analogous to NDEBUG's effects on
160*635a8641SAndroid Build Coastguard Worker    assert()) */
161*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(                               \
162*635a8641SAndroid Build Coastguard Worker         _zzq_rlval, _zzq_default, _zzq_request,                   \
163*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
164*635a8641SAndroid Build Coastguard Worker    {                                                              \
165*635a8641SAndroid Build Coastguard Worker       (_zzq_rlval) = (_zzq_default);                              \
166*635a8641SAndroid Build Coastguard Worker    }
167*635a8641SAndroid Build Coastguard Worker 
168*635a8641SAndroid Build Coastguard Worker #else  /* ! NVALGRIND */
169*635a8641SAndroid Build Coastguard Worker 
170*635a8641SAndroid Build Coastguard Worker /* The following defines the magic code sequences which the JITter
171*635a8641SAndroid Build Coastguard Worker    spots and handles magically.  Don't look too closely at them as
172*635a8641SAndroid Build Coastguard Worker    they will rot your brain.
173*635a8641SAndroid Build Coastguard Worker 
174*635a8641SAndroid Build Coastguard Worker    The assembly code sequences for all architectures is in this one
175*635a8641SAndroid Build Coastguard Worker    file.  This is because this file must be stand-alone, and we don't
176*635a8641SAndroid Build Coastguard Worker    want to have multiple files.
177*635a8641SAndroid Build Coastguard Worker 
178*635a8641SAndroid Build Coastguard Worker    For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default
179*635a8641SAndroid Build Coastguard Worker    value gets put in the return slot, so that everything works when
180*635a8641SAndroid Build Coastguard Worker    this is executed not under Valgrind.  Args are passed in a memory
181*635a8641SAndroid Build Coastguard Worker    block, and so there's no intrinsic limit to the number that could
182*635a8641SAndroid Build Coastguard Worker    be passed, but it's currently five.
183*635a8641SAndroid Build Coastguard Worker 
184*635a8641SAndroid Build Coastguard Worker    The macro args are:
185*635a8641SAndroid Build Coastguard Worker       _zzq_rlval    result lvalue
186*635a8641SAndroid Build Coastguard Worker       _zzq_default  default value (result returned when running on real CPU)
187*635a8641SAndroid Build Coastguard Worker       _zzq_request  request code
188*635a8641SAndroid Build Coastguard Worker       _zzq_arg1..5  request params
189*635a8641SAndroid Build Coastguard Worker 
190*635a8641SAndroid Build Coastguard Worker    The other two macros are used to support function wrapping, and are
191*635a8641SAndroid Build Coastguard Worker    a lot simpler.  VALGRIND_GET_NR_CONTEXT returns the value of the
192*635a8641SAndroid Build Coastguard Worker    guest's NRADDR pseudo-register and whatever other information is
193*635a8641SAndroid Build Coastguard Worker    needed to safely run the call original from the wrapper: on
194*635a8641SAndroid Build Coastguard Worker    ppc64-linux, the R2 value at the divert point is also needed.  This
195*635a8641SAndroid Build Coastguard Worker    information is abstracted into a user-visible type, OrigFn.
196*635a8641SAndroid Build Coastguard Worker 
197*635a8641SAndroid Build Coastguard Worker    VALGRIND_CALL_NOREDIR_* behaves the same as the following on the
198*635a8641SAndroid Build Coastguard Worker    guest, but guarantees that the branch instruction will not be
199*635a8641SAndroid Build Coastguard Worker    redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64:
200*635a8641SAndroid Build Coastguard Worker    branch-and-link-to-r11.  VALGRIND_CALL_NOREDIR is just text, not a
201*635a8641SAndroid Build Coastguard Worker    complete inline asm, since it needs to be combined with more magic
202*635a8641SAndroid Build Coastguard Worker    inline asm stuff to be useful.
203*635a8641SAndroid Build Coastguard Worker */
204*635a8641SAndroid Build Coastguard Worker 
205*635a8641SAndroid Build Coastguard Worker /* ------------------------- x86-{linux,darwin} ---------------- */
206*635a8641SAndroid Build Coastguard Worker 
207*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)  \
208*635a8641SAndroid Build Coastguard Worker     ||  (defined(PLAT_x86_win32) && defined(__GNUC__))
209*635a8641SAndroid Build Coastguard Worker 
210*635a8641SAndroid Build Coastguard Worker typedef
211*635a8641SAndroid Build Coastguard Worker    struct {
212*635a8641SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
213*635a8641SAndroid Build Coastguard Worker    }
214*635a8641SAndroid Build Coastguard Worker    OrigFn;
215*635a8641SAndroid Build Coastguard Worker 
216*635a8641SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
217*635a8641SAndroid Build Coastguard Worker                      "roll $3,  %%edi ; roll $13, %%edi\n\t"      \
218*635a8641SAndroid Build Coastguard Worker                      "roll $29, %%edi ; roll $19, %%edi\n\t"
219*635a8641SAndroid Build Coastguard Worker 
220*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(                               \
221*635a8641SAndroid Build Coastguard Worker         _zzq_rlval, _zzq_default, _zzq_request,                   \
222*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
223*635a8641SAndroid Build Coastguard Worker   { volatile unsigned int _zzq_args[6];                           \
224*635a8641SAndroid Build Coastguard Worker     volatile unsigned int _zzq_result;                            \
225*635a8641SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
226*635a8641SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
227*635a8641SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
228*635a8641SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
229*635a8641SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
230*635a8641SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
231*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
232*635a8641SAndroid Build Coastguard Worker                      /* %EDX = client_request ( %EAX ) */         \
233*635a8641SAndroid Build Coastguard Worker                      "xchgl %%ebx,%%ebx"                          \
234*635a8641SAndroid Build Coastguard Worker                      : "=d" (_zzq_result)                         \
235*635a8641SAndroid Build Coastguard Worker                      : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
236*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
237*635a8641SAndroid Build Coastguard Worker                     );                                            \
238*635a8641SAndroid Build Coastguard Worker     _zzq_rlval = _zzq_result;                                     \
239*635a8641SAndroid Build Coastguard Worker   }
240*635a8641SAndroid Build Coastguard Worker 
241*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
242*635a8641SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
243*635a8641SAndroid Build Coastguard Worker     volatile unsigned int __addr;                                 \
244*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
245*635a8641SAndroid Build Coastguard Worker                      /* %EAX = guest_NRADDR */                    \
246*635a8641SAndroid Build Coastguard Worker                      "xchgl %%ecx,%%ecx"                          \
247*635a8641SAndroid Build Coastguard Worker                      : "=a" (__addr)                              \
248*635a8641SAndroid Build Coastguard Worker                      :                                            \
249*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
250*635a8641SAndroid Build Coastguard Worker                     );                                            \
251*635a8641SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
252*635a8641SAndroid Build Coastguard Worker   }
253*635a8641SAndroid Build Coastguard Worker 
254*635a8641SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_EAX                                 \
255*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
256*635a8641SAndroid Build Coastguard Worker                      /* call-noredir *%EAX */                     \
257*635a8641SAndroid Build Coastguard Worker                      "xchgl %%edx,%%edx\n\t"
258*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */
259*635a8641SAndroid Build Coastguard Worker 
260*635a8641SAndroid Build Coastguard Worker /* ------------------------- x86-Win32 ------------------------- */
261*635a8641SAndroid Build Coastguard Worker 
262*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_x86_win32) && !defined(__GNUC__)
263*635a8641SAndroid Build Coastguard Worker 
264*635a8641SAndroid Build Coastguard Worker typedef
265*635a8641SAndroid Build Coastguard Worker    struct {
266*635a8641SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
267*635a8641SAndroid Build Coastguard Worker    }
268*635a8641SAndroid Build Coastguard Worker    OrigFn;
269*635a8641SAndroid Build Coastguard Worker 
270*635a8641SAndroid Build Coastguard Worker #if defined(_MSC_VER)
271*635a8641SAndroid Build Coastguard Worker 
272*635a8641SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
273*635a8641SAndroid Build Coastguard Worker                      __asm rol edi, 3  __asm rol edi, 13          \
274*635a8641SAndroid Build Coastguard Worker                      __asm rol edi, 29 __asm rol edi, 19
275*635a8641SAndroid Build Coastguard Worker 
276*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(                               \
277*635a8641SAndroid Build Coastguard Worker         _zzq_rlval, _zzq_default, _zzq_request,                   \
278*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
279*635a8641SAndroid Build Coastguard Worker   { volatile uintptr_t _zzq_args[6];                              \
280*635a8641SAndroid Build Coastguard Worker     volatile unsigned int _zzq_result;                            \
281*635a8641SAndroid Build Coastguard Worker     _zzq_args[0] = (uintptr_t)(_zzq_request);                     \
282*635a8641SAndroid Build Coastguard Worker     _zzq_args[1] = (uintptr_t)(_zzq_arg1);                        \
283*635a8641SAndroid Build Coastguard Worker     _zzq_args[2] = (uintptr_t)(_zzq_arg2);                        \
284*635a8641SAndroid Build Coastguard Worker     _zzq_args[3] = (uintptr_t)(_zzq_arg3);                        \
285*635a8641SAndroid Build Coastguard Worker     _zzq_args[4] = (uintptr_t)(_zzq_arg4);                        \
286*635a8641SAndroid Build Coastguard Worker     _zzq_args[5] = (uintptr_t)(_zzq_arg5);                        \
287*635a8641SAndroid Build Coastguard Worker     __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default  \
288*635a8641SAndroid Build Coastguard Worker             __SPECIAL_INSTRUCTION_PREAMBLE                        \
289*635a8641SAndroid Build Coastguard Worker             /* %EDX = client_request ( %EAX ) */                  \
290*635a8641SAndroid Build Coastguard Worker             __asm xchg ebx,ebx                                    \
291*635a8641SAndroid Build Coastguard Worker             __asm mov _zzq_result, edx                            \
292*635a8641SAndroid Build Coastguard Worker     }                                                             \
293*635a8641SAndroid Build Coastguard Worker     _zzq_rlval = _zzq_result;                                     \
294*635a8641SAndroid Build Coastguard Worker   }
295*635a8641SAndroid Build Coastguard Worker 
296*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
297*635a8641SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
298*635a8641SAndroid Build Coastguard Worker     volatile unsigned int __addr;                                 \
299*635a8641SAndroid Build Coastguard Worker     __asm { __SPECIAL_INSTRUCTION_PREAMBLE                        \
300*635a8641SAndroid Build Coastguard Worker             /* %EAX = guest_NRADDR */                             \
301*635a8641SAndroid Build Coastguard Worker             __asm xchg ecx,ecx                                    \
302*635a8641SAndroid Build Coastguard Worker             __asm mov __addr, eax                                 \
303*635a8641SAndroid Build Coastguard Worker     }                                                             \
304*635a8641SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
305*635a8641SAndroid Build Coastguard Worker   }
306*635a8641SAndroid Build Coastguard Worker 
307*635a8641SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_EAX ERROR
308*635a8641SAndroid Build Coastguard Worker 
309*635a8641SAndroid Build Coastguard Worker #else
310*635a8641SAndroid Build Coastguard Worker #error Unsupported compiler.
311*635a8641SAndroid Build Coastguard Worker #endif
312*635a8641SAndroid Build Coastguard Worker 
313*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_x86_win32 */
314*635a8641SAndroid Build Coastguard Worker 
315*635a8641SAndroid Build Coastguard Worker /* ------------------------ amd64-{linux,darwin} --------------- */
316*635a8641SAndroid Build Coastguard Worker 
317*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin)
318*635a8641SAndroid Build Coastguard Worker 
319*635a8641SAndroid Build Coastguard Worker typedef
320*635a8641SAndroid Build Coastguard Worker    struct {
321*635a8641SAndroid Build Coastguard Worker       unsigned long long int nraddr; /* where's the code? */
322*635a8641SAndroid Build Coastguard Worker    }
323*635a8641SAndroid Build Coastguard Worker    OrigFn;
324*635a8641SAndroid Build Coastguard Worker 
325*635a8641SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
326*635a8641SAndroid Build Coastguard Worker                      "rolq $3,  %%rdi ; rolq $13, %%rdi\n\t"      \
327*635a8641SAndroid Build Coastguard Worker                      "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
328*635a8641SAndroid Build Coastguard Worker 
329*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(                               \
330*635a8641SAndroid Build Coastguard Worker         _zzq_rlval, _zzq_default, _zzq_request,                   \
331*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
332*635a8641SAndroid Build Coastguard Worker   { volatile unsigned long long int _zzq_args[6];                 \
333*635a8641SAndroid Build Coastguard Worker     volatile unsigned long long int _zzq_result;                  \
334*635a8641SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned long long int)(_zzq_request);        \
335*635a8641SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned long long int)(_zzq_arg1);           \
336*635a8641SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned long long int)(_zzq_arg2);           \
337*635a8641SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned long long int)(_zzq_arg3);           \
338*635a8641SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned long long int)(_zzq_arg4);           \
339*635a8641SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned long long int)(_zzq_arg5);           \
340*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
341*635a8641SAndroid Build Coastguard Worker                      /* %RDX = client_request ( %RAX ) */         \
342*635a8641SAndroid Build Coastguard Worker                      "xchgq %%rbx,%%rbx"                          \
343*635a8641SAndroid Build Coastguard Worker                      : "=d" (_zzq_result)                         \
344*635a8641SAndroid Build Coastguard Worker                      : "a" (&_zzq_args[0]), "0" (_zzq_default)    \
345*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
346*635a8641SAndroid Build Coastguard Worker                     );                                            \
347*635a8641SAndroid Build Coastguard Worker     _zzq_rlval = _zzq_result;                                     \
348*635a8641SAndroid Build Coastguard Worker   }
349*635a8641SAndroid Build Coastguard Worker 
350*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
351*635a8641SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
352*635a8641SAndroid Build Coastguard Worker     volatile unsigned long long int __addr;                       \
353*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
354*635a8641SAndroid Build Coastguard Worker                      /* %RAX = guest_NRADDR */                    \
355*635a8641SAndroid Build Coastguard Worker                      "xchgq %%rcx,%%rcx"                          \
356*635a8641SAndroid Build Coastguard Worker                      : "=a" (__addr)                              \
357*635a8641SAndroid Build Coastguard Worker                      :                                            \
358*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
359*635a8641SAndroid Build Coastguard Worker                     );                                            \
360*635a8641SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
361*635a8641SAndroid Build Coastguard Worker   }
362*635a8641SAndroid Build Coastguard Worker 
363*635a8641SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_RAX                                 \
364*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
365*635a8641SAndroid Build Coastguard Worker                      /* call-noredir *%RAX */                     \
366*635a8641SAndroid Build Coastguard Worker                      "xchgq %%rdx,%%rdx\n\t"
367*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
368*635a8641SAndroid Build Coastguard Worker 
369*635a8641SAndroid Build Coastguard Worker /* ------------------------ ppc32-linux ------------------------ */
370*635a8641SAndroid Build Coastguard Worker 
371*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_ppc32_linux)
372*635a8641SAndroid Build Coastguard Worker 
373*635a8641SAndroid Build Coastguard Worker typedef
374*635a8641SAndroid Build Coastguard Worker    struct {
375*635a8641SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
376*635a8641SAndroid Build Coastguard Worker    }
377*635a8641SAndroid Build Coastguard Worker    OrigFn;
378*635a8641SAndroid Build Coastguard Worker 
379*635a8641SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
380*635a8641SAndroid Build Coastguard Worker                      "rlwinm 0,0,3,0,0  ; rlwinm 0,0,13,0,0\n\t"  \
381*635a8641SAndroid Build Coastguard Worker                      "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
382*635a8641SAndroid Build Coastguard Worker 
383*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(                               \
384*635a8641SAndroid Build Coastguard Worker         _zzq_rlval, _zzq_default, _zzq_request,                   \
385*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
386*635a8641SAndroid Build Coastguard Worker                                                                   \
387*635a8641SAndroid Build Coastguard Worker   {          unsigned int  _zzq_args[6];                          \
388*635a8641SAndroid Build Coastguard Worker              unsigned int  _zzq_result;                           \
389*635a8641SAndroid Build Coastguard Worker              unsigned int* _zzq_ptr;                              \
390*635a8641SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
391*635a8641SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
392*635a8641SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
393*635a8641SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
394*635a8641SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
395*635a8641SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
396*635a8641SAndroid Build Coastguard Worker     _zzq_ptr = _zzq_args;                                         \
397*635a8641SAndroid Build Coastguard Worker     __asm__ volatile("mr 3,%1\n\t" /*default*/                    \
398*635a8641SAndroid Build Coastguard Worker                      "mr 4,%2\n\t" /*ptr*/                        \
399*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
400*635a8641SAndroid Build Coastguard Worker                      /* %R3 = client_request ( %R4 ) */           \
401*635a8641SAndroid Build Coastguard Worker                      "or 1,1,1\n\t"                               \
402*635a8641SAndroid Build Coastguard Worker                      "mr %0,3"     /*result*/                     \
403*635a8641SAndroid Build Coastguard Worker                      : "=b" (_zzq_result)                         \
404*635a8641SAndroid Build Coastguard Worker                      : "b" (_zzq_default), "b" (_zzq_ptr)         \
405*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory", "r3", "r4");               \
406*635a8641SAndroid Build Coastguard Worker     _zzq_rlval = _zzq_result;                                     \
407*635a8641SAndroid Build Coastguard Worker   }
408*635a8641SAndroid Build Coastguard Worker 
409*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
410*635a8641SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
411*635a8641SAndroid Build Coastguard Worker     unsigned int __addr;                                          \
412*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
413*635a8641SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR */                     \
414*635a8641SAndroid Build Coastguard Worker                      "or 2,2,2\n\t"                               \
415*635a8641SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
416*635a8641SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
417*635a8641SAndroid Build Coastguard Worker                      :                                            \
418*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory", "r3"                       \
419*635a8641SAndroid Build Coastguard Worker                     );                                            \
420*635a8641SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
421*635a8641SAndroid Build Coastguard Worker   }
422*635a8641SAndroid Build Coastguard Worker 
423*635a8641SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
424*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
425*635a8641SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir *%R11 */       \
426*635a8641SAndroid Build Coastguard Worker                      "or 3,3,3\n\t"
427*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_ppc32_linux */
428*635a8641SAndroid Build Coastguard Worker 
429*635a8641SAndroid Build Coastguard Worker /* ------------------------ ppc64-linux ------------------------ */
430*635a8641SAndroid Build Coastguard Worker 
431*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_ppc64_linux)
432*635a8641SAndroid Build Coastguard Worker 
433*635a8641SAndroid Build Coastguard Worker typedef
434*635a8641SAndroid Build Coastguard Worker    struct {
435*635a8641SAndroid Build Coastguard Worker       unsigned long long int nraddr; /* where's the code? */
436*635a8641SAndroid Build Coastguard Worker       unsigned long long int r2;  /* what tocptr do we need? */
437*635a8641SAndroid Build Coastguard Worker    }
438*635a8641SAndroid Build Coastguard Worker    OrigFn;
439*635a8641SAndroid Build Coastguard Worker 
440*635a8641SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
441*635a8641SAndroid Build Coastguard Worker                      "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
442*635a8641SAndroid Build Coastguard Worker                      "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
443*635a8641SAndroid Build Coastguard Worker 
444*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(                               \
445*635a8641SAndroid Build Coastguard Worker         _zzq_rlval, _zzq_default, _zzq_request,                   \
446*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
447*635a8641SAndroid Build Coastguard Worker                                                                   \
448*635a8641SAndroid Build Coastguard Worker   {          unsigned long long int  _zzq_args[6];                \
449*635a8641SAndroid Build Coastguard Worker     register unsigned long long int  _zzq_result __asm__("r3");   \
450*635a8641SAndroid Build Coastguard Worker     register unsigned long long int* _zzq_ptr __asm__("r4");      \
451*635a8641SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned long long int)(_zzq_request);        \
452*635a8641SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned long long int)(_zzq_arg1);           \
453*635a8641SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned long long int)(_zzq_arg2);           \
454*635a8641SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned long long int)(_zzq_arg3);           \
455*635a8641SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned long long int)(_zzq_arg4);           \
456*635a8641SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned long long int)(_zzq_arg5);           \
457*635a8641SAndroid Build Coastguard Worker     _zzq_ptr = _zzq_args;                                         \
458*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
459*635a8641SAndroid Build Coastguard Worker                      /* %R3 = client_request ( %R4 ) */           \
460*635a8641SAndroid Build Coastguard Worker                      "or 1,1,1"                                   \
461*635a8641SAndroid Build Coastguard Worker                      : "=r" (_zzq_result)                         \
462*635a8641SAndroid Build Coastguard Worker                      : "0" (_zzq_default), "r" (_zzq_ptr)         \
463*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory");                           \
464*635a8641SAndroid Build Coastguard Worker     _zzq_rlval = _zzq_result;                                     \
465*635a8641SAndroid Build Coastguard Worker   }
466*635a8641SAndroid Build Coastguard Worker 
467*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
468*635a8641SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
469*635a8641SAndroid Build Coastguard Worker     register unsigned long long int __addr __asm__("r3");         \
470*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
471*635a8641SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR */                     \
472*635a8641SAndroid Build Coastguard Worker                      "or 2,2,2"                                   \
473*635a8641SAndroid Build Coastguard Worker                      : "=r" (__addr)                              \
474*635a8641SAndroid Build Coastguard Worker                      :                                            \
475*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
476*635a8641SAndroid Build Coastguard Worker                     );                                            \
477*635a8641SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
478*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
479*635a8641SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR_GPR2 */                \
480*635a8641SAndroid Build Coastguard Worker                      "or 4,4,4"                                   \
481*635a8641SAndroid Build Coastguard Worker                      : "=r" (__addr)                              \
482*635a8641SAndroid Build Coastguard Worker                      :                                            \
483*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory"                             \
484*635a8641SAndroid Build Coastguard Worker                     );                                            \
485*635a8641SAndroid Build Coastguard Worker     _zzq_orig->r2 = __addr;                                       \
486*635a8641SAndroid Build Coastguard Worker   }
487*635a8641SAndroid Build Coastguard Worker 
488*635a8641SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
489*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
490*635a8641SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir *%R11 */       \
491*635a8641SAndroid Build Coastguard Worker                      "or 3,3,3\n\t"
492*635a8641SAndroid Build Coastguard Worker 
493*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_ppc64_linux */
494*635a8641SAndroid Build Coastguard Worker 
495*635a8641SAndroid Build Coastguard Worker /* ------------------------- arm-linux ------------------------- */
496*635a8641SAndroid Build Coastguard Worker 
497*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_arm_linux)
498*635a8641SAndroid Build Coastguard Worker 
499*635a8641SAndroid Build Coastguard Worker typedef
500*635a8641SAndroid Build Coastguard Worker    struct {
501*635a8641SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
502*635a8641SAndroid Build Coastguard Worker    }
503*635a8641SAndroid Build Coastguard Worker    OrigFn;
504*635a8641SAndroid Build Coastguard Worker 
505*635a8641SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
506*635a8641SAndroid Build Coastguard Worker             "mov r12, r12, ror #3  ; mov r12, r12, ror #13 \n\t"  \
507*635a8641SAndroid Build Coastguard Worker             "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
508*635a8641SAndroid Build Coastguard Worker 
509*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(                               \
510*635a8641SAndroid Build Coastguard Worker         _zzq_rlval, _zzq_default, _zzq_request,                   \
511*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
512*635a8641SAndroid Build Coastguard Worker                                                                   \
513*635a8641SAndroid Build Coastguard Worker   { volatile unsigned int  _zzq_args[6];                          \
514*635a8641SAndroid Build Coastguard Worker     volatile unsigned int  _zzq_result;                           \
515*635a8641SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
516*635a8641SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
517*635a8641SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
518*635a8641SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
519*635a8641SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
520*635a8641SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
521*635a8641SAndroid Build Coastguard Worker     __asm__ volatile("mov r3, %1\n\t" /*default*/                 \
522*635a8641SAndroid Build Coastguard Worker                      "mov r4, %2\n\t" /*ptr*/                     \
523*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
524*635a8641SAndroid Build Coastguard Worker                      /* R3 = client_request ( R4 ) */             \
525*635a8641SAndroid Build Coastguard Worker                      "orr r10, r10, r10\n\t"                      \
526*635a8641SAndroid Build Coastguard Worker                      "mov %0, r3"     /*result*/                  \
527*635a8641SAndroid Build Coastguard Worker                      : "=r" (_zzq_result)                         \
528*635a8641SAndroid Build Coastguard Worker                      : "r" (_zzq_default), "r" (&_zzq_args[0])    \
529*635a8641SAndroid Build Coastguard Worker                      : "cc","memory", "r3", "r4");                \
530*635a8641SAndroid Build Coastguard Worker     _zzq_rlval = _zzq_result;                                     \
531*635a8641SAndroid Build Coastguard Worker   }
532*635a8641SAndroid Build Coastguard Worker 
533*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
534*635a8641SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
535*635a8641SAndroid Build Coastguard Worker     unsigned int __addr;                                          \
536*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
537*635a8641SAndroid Build Coastguard Worker                      /* R3 = guest_NRADDR */                      \
538*635a8641SAndroid Build Coastguard Worker                      "orr r11, r11, r11\n\t"                      \
539*635a8641SAndroid Build Coastguard Worker                      "mov %0, r3"                                 \
540*635a8641SAndroid Build Coastguard Worker                      : "=r" (__addr)                              \
541*635a8641SAndroid Build Coastguard Worker                      :                                            \
542*635a8641SAndroid Build Coastguard Worker                      : "cc", "memory", "r3"                       \
543*635a8641SAndroid Build Coastguard Worker                     );                                            \
544*635a8641SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
545*635a8641SAndroid Build Coastguard Worker   }
546*635a8641SAndroid Build Coastguard Worker 
547*635a8641SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                    \
548*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
549*635a8641SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir *%R4 */        \
550*635a8641SAndroid Build Coastguard Worker                      "orr r12, r12, r12\n\t"
551*635a8641SAndroid Build Coastguard Worker 
552*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_arm_linux */
553*635a8641SAndroid Build Coastguard Worker 
554*635a8641SAndroid Build Coastguard Worker /* ------------------------ ppc32-aix5 ------------------------- */
555*635a8641SAndroid Build Coastguard Worker 
556*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_ppc32_aix5)
557*635a8641SAndroid Build Coastguard Worker 
558*635a8641SAndroid Build Coastguard Worker typedef
559*635a8641SAndroid Build Coastguard Worker    struct {
560*635a8641SAndroid Build Coastguard Worker       unsigned int nraddr; /* where's the code? */
561*635a8641SAndroid Build Coastguard Worker       unsigned int r2;  /* what tocptr do we need? */
562*635a8641SAndroid Build Coastguard Worker    }
563*635a8641SAndroid Build Coastguard Worker    OrigFn;
564*635a8641SAndroid Build Coastguard Worker 
565*635a8641SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
566*635a8641SAndroid Build Coastguard Worker                      "rlwinm 0,0,3,0,0  ; rlwinm 0,0,13,0,0\n\t"  \
567*635a8641SAndroid Build Coastguard Worker                      "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
568*635a8641SAndroid Build Coastguard Worker 
569*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(                               \
570*635a8641SAndroid Build Coastguard Worker         _zzq_rlval, _zzq_default, _zzq_request,                   \
571*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
572*635a8641SAndroid Build Coastguard Worker                                                                   \
573*635a8641SAndroid Build Coastguard Worker   {          unsigned int  _zzq_args[7];                          \
574*635a8641SAndroid Build Coastguard Worker     register unsigned int  _zzq_result;                           \
575*635a8641SAndroid Build Coastguard Worker     register unsigned int* _zzq_ptr;                              \
576*635a8641SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int)(_zzq_request);                  \
577*635a8641SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int)(_zzq_arg1);                     \
578*635a8641SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int)(_zzq_arg2);                     \
579*635a8641SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int)(_zzq_arg3);                     \
580*635a8641SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int)(_zzq_arg4);                     \
581*635a8641SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int)(_zzq_arg5);                     \
582*635a8641SAndroid Build Coastguard Worker     _zzq_args[6] = (unsigned int)(_zzq_default);                  \
583*635a8641SAndroid Build Coastguard Worker     _zzq_ptr = _zzq_args;                                         \
584*635a8641SAndroid Build Coastguard Worker     __asm__ volatile("mr 4,%1\n\t"                                \
585*635a8641SAndroid Build Coastguard Worker                      "lwz 3, 24(4)\n\t"                           \
586*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
587*635a8641SAndroid Build Coastguard Worker                      /* %R3 = client_request ( %R4 ) */           \
588*635a8641SAndroid Build Coastguard Worker                      "or 1,1,1\n\t"                               \
589*635a8641SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
590*635a8641SAndroid Build Coastguard Worker                      : "=b" (_zzq_result)                         \
591*635a8641SAndroid Build Coastguard Worker                      : "b" (_zzq_ptr)                             \
592*635a8641SAndroid Build Coastguard Worker                      : "r3", "r4", "cc", "memory");               \
593*635a8641SAndroid Build Coastguard Worker     _zzq_rlval = _zzq_result;                                     \
594*635a8641SAndroid Build Coastguard Worker   }
595*635a8641SAndroid Build Coastguard Worker 
596*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
597*635a8641SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
598*635a8641SAndroid Build Coastguard Worker     register unsigned int __addr;                                 \
599*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
600*635a8641SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR */                     \
601*635a8641SAndroid Build Coastguard Worker                      "or 2,2,2\n\t"                               \
602*635a8641SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
603*635a8641SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
604*635a8641SAndroid Build Coastguard Worker                      :                                            \
605*635a8641SAndroid Build Coastguard Worker                      : "r3", "cc", "memory"                       \
606*635a8641SAndroid Build Coastguard Worker                     );                                            \
607*635a8641SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
608*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
609*635a8641SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR_GPR2 */                \
610*635a8641SAndroid Build Coastguard Worker                      "or 4,4,4\n\t"                               \
611*635a8641SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
612*635a8641SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
613*635a8641SAndroid Build Coastguard Worker                      :                                            \
614*635a8641SAndroid Build Coastguard Worker                      : "r3", "cc", "memory"                       \
615*635a8641SAndroid Build Coastguard Worker                     );                                            \
616*635a8641SAndroid Build Coastguard Worker     _zzq_orig->r2 = __addr;                                       \
617*635a8641SAndroid Build Coastguard Worker   }
618*635a8641SAndroid Build Coastguard Worker 
619*635a8641SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
620*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
621*635a8641SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir *%R11 */       \
622*635a8641SAndroid Build Coastguard Worker                      "or 3,3,3\n\t"
623*635a8641SAndroid Build Coastguard Worker 
624*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_ppc32_aix5 */
625*635a8641SAndroid Build Coastguard Worker 
626*635a8641SAndroid Build Coastguard Worker /* ------------------------ ppc64-aix5 ------------------------- */
627*635a8641SAndroid Build Coastguard Worker 
628*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_ppc64_aix5)
629*635a8641SAndroid Build Coastguard Worker 
630*635a8641SAndroid Build Coastguard Worker typedef
631*635a8641SAndroid Build Coastguard Worker    struct {
632*635a8641SAndroid Build Coastguard Worker       unsigned long long int nraddr; /* where's the code? */
633*635a8641SAndroid Build Coastguard Worker       unsigned long long int r2;  /* what tocptr do we need? */
634*635a8641SAndroid Build Coastguard Worker    }
635*635a8641SAndroid Build Coastguard Worker    OrigFn;
636*635a8641SAndroid Build Coastguard Worker 
637*635a8641SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
638*635a8641SAndroid Build Coastguard Worker                      "rotldi 0,0,3  ; rotldi 0,0,13\n\t"          \
639*635a8641SAndroid Build Coastguard Worker                      "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
640*635a8641SAndroid Build Coastguard Worker 
641*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(                               \
642*635a8641SAndroid Build Coastguard Worker         _zzq_rlval, _zzq_default, _zzq_request,                   \
643*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)    \
644*635a8641SAndroid Build Coastguard Worker                                                                   \
645*635a8641SAndroid Build Coastguard Worker   {          unsigned long long int  _zzq_args[7];                \
646*635a8641SAndroid Build Coastguard Worker     register unsigned long long int  _zzq_result;                 \
647*635a8641SAndroid Build Coastguard Worker     register unsigned long long int* _zzq_ptr;                    \
648*635a8641SAndroid Build Coastguard Worker     _zzq_args[0] = (unsigned int long long)(_zzq_request);        \
649*635a8641SAndroid Build Coastguard Worker     _zzq_args[1] = (unsigned int long long)(_zzq_arg1);           \
650*635a8641SAndroid Build Coastguard Worker     _zzq_args[2] = (unsigned int long long)(_zzq_arg2);           \
651*635a8641SAndroid Build Coastguard Worker     _zzq_args[3] = (unsigned int long long)(_zzq_arg3);           \
652*635a8641SAndroid Build Coastguard Worker     _zzq_args[4] = (unsigned int long long)(_zzq_arg4);           \
653*635a8641SAndroid Build Coastguard Worker     _zzq_args[5] = (unsigned int long long)(_zzq_arg5);           \
654*635a8641SAndroid Build Coastguard Worker     _zzq_args[6] = (unsigned int long long)(_zzq_default);        \
655*635a8641SAndroid Build Coastguard Worker     _zzq_ptr = _zzq_args;                                         \
656*635a8641SAndroid Build Coastguard Worker     __asm__ volatile("mr 4,%1\n\t"                                \
657*635a8641SAndroid Build Coastguard Worker                      "ld 3, 48(4)\n\t"                            \
658*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
659*635a8641SAndroid Build Coastguard Worker                      /* %R3 = client_request ( %R4 ) */           \
660*635a8641SAndroid Build Coastguard Worker                      "or 1,1,1\n\t"                               \
661*635a8641SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
662*635a8641SAndroid Build Coastguard Worker                      : "=b" (_zzq_result)                         \
663*635a8641SAndroid Build Coastguard Worker                      : "b" (_zzq_ptr)                             \
664*635a8641SAndroid Build Coastguard Worker                      : "r3", "r4", "cc", "memory");               \
665*635a8641SAndroid Build Coastguard Worker     _zzq_rlval = _zzq_result;                                     \
666*635a8641SAndroid Build Coastguard Worker   }
667*635a8641SAndroid Build Coastguard Worker 
668*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
669*635a8641SAndroid Build Coastguard Worker   { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
670*635a8641SAndroid Build Coastguard Worker     register unsigned long long int __addr;                       \
671*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
672*635a8641SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR */                     \
673*635a8641SAndroid Build Coastguard Worker                      "or 2,2,2\n\t"                               \
674*635a8641SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
675*635a8641SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
676*635a8641SAndroid Build Coastguard Worker                      :                                            \
677*635a8641SAndroid Build Coastguard Worker                      : "r3", "cc", "memory"                       \
678*635a8641SAndroid Build Coastguard Worker                     );                                            \
679*635a8641SAndroid Build Coastguard Worker     _zzq_orig->nraddr = __addr;                                   \
680*635a8641SAndroid Build Coastguard Worker     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
681*635a8641SAndroid Build Coastguard Worker                      /* %R3 = guest_NRADDR_GPR2 */                \
682*635a8641SAndroid Build Coastguard Worker                      "or 4,4,4\n\t"                               \
683*635a8641SAndroid Build Coastguard Worker                      "mr %0,3"                                    \
684*635a8641SAndroid Build Coastguard Worker                      : "=b" (__addr)                              \
685*635a8641SAndroid Build Coastguard Worker                      :                                            \
686*635a8641SAndroid Build Coastguard Worker                      : "r3", "cc", "memory"                       \
687*635a8641SAndroid Build Coastguard Worker                     );                                            \
688*635a8641SAndroid Build Coastguard Worker     _zzq_orig->r2 = __addr;                                       \
689*635a8641SAndroid Build Coastguard Worker   }
690*635a8641SAndroid Build Coastguard Worker 
691*635a8641SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                   \
692*635a8641SAndroid Build Coastguard Worker                      __SPECIAL_INSTRUCTION_PREAMBLE               \
693*635a8641SAndroid Build Coastguard Worker                      /* branch-and-link-to-noredir *%R11 */       \
694*635a8641SAndroid Build Coastguard Worker                      "or 3,3,3\n\t"
695*635a8641SAndroid Build Coastguard Worker 
696*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_ppc64_aix5 */
697*635a8641SAndroid Build Coastguard Worker 
698*635a8641SAndroid Build Coastguard Worker /* Insert assembly code for other platforms here... */
699*635a8641SAndroid Build Coastguard Worker 
700*635a8641SAndroid Build Coastguard Worker #endif /* NVALGRIND */
701*635a8641SAndroid Build Coastguard Worker 
702*635a8641SAndroid Build Coastguard Worker 
703*635a8641SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
704*635a8641SAndroid Build Coastguard Worker /* PLATFORM SPECIFICS for FUNCTION WRAPPING.  This is all very        */
705*635a8641SAndroid Build Coastguard Worker /* ugly.  It's the least-worst tradeoff I can think of.               */
706*635a8641SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
707*635a8641SAndroid Build Coastguard Worker 
708*635a8641SAndroid Build Coastguard Worker /* This section defines magic (a.k.a appalling-hack) macros for doing
709*635a8641SAndroid Build Coastguard Worker    guaranteed-no-redirection macros, so as to get from function
710*635a8641SAndroid Build Coastguard Worker    wrappers to the functions they are wrapping.  The whole point is to
711*635a8641SAndroid Build Coastguard Worker    construct standard call sequences, but to do the call itself with a
712*635a8641SAndroid Build Coastguard Worker    special no-redirect call pseudo-instruction that the JIT
713*635a8641SAndroid Build Coastguard Worker    understands and handles specially.  This section is long and
714*635a8641SAndroid Build Coastguard Worker    repetitious, and I can't see a way to make it shorter.
715*635a8641SAndroid Build Coastguard Worker 
716*635a8641SAndroid Build Coastguard Worker    The naming scheme is as follows:
717*635a8641SAndroid Build Coastguard Worker 
718*635a8641SAndroid Build Coastguard Worker       CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc}
719*635a8641SAndroid Build Coastguard Worker 
720*635a8641SAndroid Build Coastguard Worker    'W' stands for "word" and 'v' for "void".  Hence there are
721*635a8641SAndroid Build Coastguard Worker    different macros for calling arity 0, 1, 2, 3, 4, etc, functions,
722*635a8641SAndroid Build Coastguard Worker    and for each, the possibility of returning a word-typed result, or
723*635a8641SAndroid Build Coastguard Worker    no result.
724*635a8641SAndroid Build Coastguard Worker */
725*635a8641SAndroid Build Coastguard Worker 
726*635a8641SAndroid Build Coastguard Worker /* Use these to write the name of your wrapper.  NOTE: duplicates
727*635a8641SAndroid Build Coastguard Worker    VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. */
728*635a8641SAndroid Build Coastguard Worker 
729*635a8641SAndroid Build Coastguard Worker /* Use an extra level of macroisation so as to ensure the soname/fnname
730*635a8641SAndroid Build Coastguard Worker    args are fully macro-expanded before pasting them together. */
731*635a8641SAndroid Build Coastguard Worker #define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
732*635a8641SAndroid Build Coastguard Worker 
733*635a8641SAndroid Build Coastguard Worker #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname)                    \
734*635a8641SAndroid Build Coastguard Worker    VG_CONCAT4(_vgwZU_,soname,_,fnname)
735*635a8641SAndroid Build Coastguard Worker 
736*635a8641SAndroid Build Coastguard Worker #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname)                    \
737*635a8641SAndroid Build Coastguard Worker    VG_CONCAT4(_vgwZZ_,soname,_,fnname)
738*635a8641SAndroid Build Coastguard Worker 
739*635a8641SAndroid Build Coastguard Worker /* Use this macro from within a wrapper function to collect the
740*635a8641SAndroid Build Coastguard Worker    context (address and possibly other info) of the original function.
741*635a8641SAndroid Build Coastguard Worker    Once you have that you can then use it in one of the CALL_FN_
742*635a8641SAndroid Build Coastguard Worker    macros.  The type of the argument _lval is OrigFn. */
743*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_ORIG_FN(_lval)  VALGRIND_GET_NR_CONTEXT(_lval)
744*635a8641SAndroid Build Coastguard Worker 
745*635a8641SAndroid Build Coastguard Worker /* Derivatives of the main macros below, for calling functions
746*635a8641SAndroid Build Coastguard Worker    returning void. */
747*635a8641SAndroid Build Coastguard Worker 
748*635a8641SAndroid Build Coastguard Worker #define CALL_FN_v_v(fnptr)                                        \
749*635a8641SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
750*635a8641SAndroid Build Coastguard Worker         CALL_FN_W_v(_junk,fnptr); } while (0)
751*635a8641SAndroid Build Coastguard Worker 
752*635a8641SAndroid Build Coastguard Worker #define CALL_FN_v_W(fnptr, arg1)                                  \
753*635a8641SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
754*635a8641SAndroid Build Coastguard Worker         CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
755*635a8641SAndroid Build Coastguard Worker 
756*635a8641SAndroid Build Coastguard Worker #define CALL_FN_v_WW(fnptr, arg1,arg2)                            \
757*635a8641SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
758*635a8641SAndroid Build Coastguard Worker         CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
759*635a8641SAndroid Build Coastguard Worker 
760*635a8641SAndroid Build Coastguard Worker #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3)                      \
761*635a8641SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
762*635a8641SAndroid Build Coastguard Worker         CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
763*635a8641SAndroid Build Coastguard Worker 
764*635a8641SAndroid Build Coastguard Worker #define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4)                \
765*635a8641SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
766*635a8641SAndroid Build Coastguard Worker         CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
767*635a8641SAndroid Build Coastguard Worker 
768*635a8641SAndroid Build Coastguard Worker #define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5)             \
769*635a8641SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
770*635a8641SAndroid Build Coastguard Worker         CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
771*635a8641SAndroid Build Coastguard Worker 
772*635a8641SAndroid Build Coastguard Worker #define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6)        \
773*635a8641SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
774*635a8641SAndroid Build Coastguard Worker         CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
775*635a8641SAndroid Build Coastguard Worker 
776*635a8641SAndroid Build Coastguard Worker #define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7)   \
777*635a8641SAndroid Build Coastguard Worker    do { volatile unsigned long _junk;                             \
778*635a8641SAndroid Build Coastguard Worker         CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
779*635a8641SAndroid Build Coastguard Worker 
780*635a8641SAndroid Build Coastguard Worker /* ------------------------- x86-{linux,darwin} ---------------- */
781*635a8641SAndroid Build Coastguard Worker 
782*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_x86_linux)  ||  defined(PLAT_x86_darwin)
783*635a8641SAndroid Build Coastguard Worker 
784*635a8641SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call.  No need to mention eax
785*635a8641SAndroid Build Coastguard Worker    as gcc can already see that, plus causes gcc to bomb. */
786*635a8641SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx"
787*635a8641SAndroid Build Coastguard Worker 
788*635a8641SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned
789*635a8641SAndroid Build Coastguard Worker    long) == 4. */
790*635a8641SAndroid Build Coastguard Worker 
791*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
792*635a8641SAndroid Build Coastguard Worker    do {                                                           \
793*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
794*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
795*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
796*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
797*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
798*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
799*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
800*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
801*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
802*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
803*635a8641SAndroid Build Coastguard Worker       );                                                          \
804*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
805*635a8641SAndroid Build Coastguard Worker    } while (0)
806*635a8641SAndroid Build Coastguard Worker 
807*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
808*635a8641SAndroid Build Coastguard Worker    do {                                                           \
809*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
810*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                          \
811*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
812*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
813*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
814*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
815*635a8641SAndroid Build Coastguard Worker          "subl $12, %%esp\n\t"                                    \
816*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
817*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
818*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
819*635a8641SAndroid Build Coastguard Worker          "addl $16, %%esp\n"                                      \
820*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
821*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
822*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
823*635a8641SAndroid Build Coastguard Worker       );                                                          \
824*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
825*635a8641SAndroid Build Coastguard Worker    } while (0)
826*635a8641SAndroid Build Coastguard Worker 
827*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
828*635a8641SAndroid Build Coastguard Worker    do {                                                           \
829*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
830*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
831*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
832*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
833*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
834*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
835*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
836*635a8641SAndroid Build Coastguard Worker          "subl $8, %%esp\n\t"                                     \
837*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
838*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
839*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
840*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
841*635a8641SAndroid Build Coastguard Worker          "addl $16, %%esp\n"                                      \
842*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
843*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
844*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
845*635a8641SAndroid Build Coastguard Worker       );                                                          \
846*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
847*635a8641SAndroid Build Coastguard Worker    } while (0)
848*635a8641SAndroid Build Coastguard Worker 
849*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
850*635a8641SAndroid Build Coastguard Worker    do {                                                           \
851*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
852*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
853*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
854*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
855*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
856*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
857*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
858*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
859*635a8641SAndroid Build Coastguard Worker          "subl $4, %%esp\n\t"                                     \
860*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
861*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
862*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
863*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
864*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
865*635a8641SAndroid Build Coastguard Worker          "addl $16, %%esp\n"                                      \
866*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
867*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
868*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
869*635a8641SAndroid Build Coastguard Worker       );                                                          \
870*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
871*635a8641SAndroid Build Coastguard Worker    } while (0)
872*635a8641SAndroid Build Coastguard Worker 
873*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
874*635a8641SAndroid Build Coastguard Worker    do {                                                           \
875*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
876*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
877*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
878*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
879*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
880*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
881*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
882*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
883*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
884*635a8641SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
885*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
886*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
887*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
888*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
889*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
890*635a8641SAndroid Build Coastguard Worker          "addl $16, %%esp\n"                                      \
891*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
892*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
893*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
894*635a8641SAndroid Build Coastguard Worker       );                                                          \
895*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
896*635a8641SAndroid Build Coastguard Worker    } while (0)
897*635a8641SAndroid Build Coastguard Worker 
898*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
899*635a8641SAndroid Build Coastguard Worker    do {                                                           \
900*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
901*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
902*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
903*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
904*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
905*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
906*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
907*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
908*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
909*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
910*635a8641SAndroid Build Coastguard Worker          "subl $12, %%esp\n\t"                                    \
911*635a8641SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
912*635a8641SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
913*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
914*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
915*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
916*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
917*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
918*635a8641SAndroid Build Coastguard Worker          "addl $32, %%esp\n"                                      \
919*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
920*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
921*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
922*635a8641SAndroid Build Coastguard Worker       );                                                          \
923*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
924*635a8641SAndroid Build Coastguard Worker    } while (0)
925*635a8641SAndroid Build Coastguard Worker 
926*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
927*635a8641SAndroid Build Coastguard Worker    do {                                                           \
928*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
929*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
930*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
931*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
932*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
933*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
934*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
935*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
936*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
937*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
938*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
939*635a8641SAndroid Build Coastguard Worker          "subl $8, %%esp\n\t"                                     \
940*635a8641SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
941*635a8641SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
942*635a8641SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
943*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
944*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
945*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
946*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
947*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
948*635a8641SAndroid Build Coastguard Worker          "addl $32, %%esp\n"                                      \
949*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
950*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
951*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
952*635a8641SAndroid Build Coastguard Worker       );                                                          \
953*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
954*635a8641SAndroid Build Coastguard Worker    } while (0)
955*635a8641SAndroid Build Coastguard Worker 
956*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
957*635a8641SAndroid Build Coastguard Worker                                  arg7)                            \
958*635a8641SAndroid Build Coastguard Worker    do {                                                           \
959*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
960*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
961*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
962*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
963*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
964*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
965*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
966*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
967*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
968*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
969*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
970*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
971*635a8641SAndroid Build Coastguard Worker          "subl $4, %%esp\n\t"                                     \
972*635a8641SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
973*635a8641SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
974*635a8641SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
975*635a8641SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
976*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
977*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
978*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
979*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
980*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
981*635a8641SAndroid Build Coastguard Worker          "addl $32, %%esp\n"                                      \
982*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
983*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
984*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
985*635a8641SAndroid Build Coastguard Worker       );                                                          \
986*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
987*635a8641SAndroid Build Coastguard Worker    } while (0)
988*635a8641SAndroid Build Coastguard Worker 
989*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
990*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
991*635a8641SAndroid Build Coastguard Worker    do {                                                           \
992*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
993*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
994*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
995*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
996*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
997*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
998*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
999*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1000*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1001*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1002*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1003*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1004*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1005*635a8641SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1006*635a8641SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1007*635a8641SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1008*635a8641SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1009*635a8641SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1010*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1011*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1012*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1013*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1014*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1015*635a8641SAndroid Build Coastguard Worker          "addl $32, %%esp\n"                                      \
1016*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1017*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1018*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1019*635a8641SAndroid Build Coastguard Worker       );                                                          \
1020*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1021*635a8641SAndroid Build Coastguard Worker    } while (0)
1022*635a8641SAndroid Build Coastguard Worker 
1023*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1024*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
1025*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1026*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1027*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
1028*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1029*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1030*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1031*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1032*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1033*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1034*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1035*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1036*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1037*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1038*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1039*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1040*635a8641SAndroid Build Coastguard Worker          "subl $12, %%esp\n\t"                                    \
1041*635a8641SAndroid Build Coastguard Worker          "pushl 36(%%eax)\n\t"                                    \
1042*635a8641SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1043*635a8641SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1044*635a8641SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1045*635a8641SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1046*635a8641SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1047*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1048*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1049*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1050*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1051*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1052*635a8641SAndroid Build Coastguard Worker          "addl $48, %%esp\n"                                      \
1053*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1054*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1055*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1056*635a8641SAndroid Build Coastguard Worker       );                                                          \
1057*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1058*635a8641SAndroid Build Coastguard Worker    } while (0)
1059*635a8641SAndroid Build Coastguard Worker 
1060*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
1061*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
1062*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1063*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1064*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
1065*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1066*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1067*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1068*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1069*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1070*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1071*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1072*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1073*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1074*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1075*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1076*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
1077*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1078*635a8641SAndroid Build Coastguard Worker          "subl $8, %%esp\n\t"                                     \
1079*635a8641SAndroid Build Coastguard Worker          "pushl 40(%%eax)\n\t"                                    \
1080*635a8641SAndroid Build Coastguard Worker          "pushl 36(%%eax)\n\t"                                    \
1081*635a8641SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1082*635a8641SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1083*635a8641SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1084*635a8641SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1085*635a8641SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1086*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1087*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1088*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1089*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1090*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1091*635a8641SAndroid Build Coastguard Worker          "addl $48, %%esp\n"                                      \
1092*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1093*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1094*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1095*635a8641SAndroid Build Coastguard Worker       );                                                          \
1096*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1097*635a8641SAndroid Build Coastguard Worker    } while (0)
1098*635a8641SAndroid Build Coastguard Worker 
1099*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
1100*635a8641SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
1101*635a8641SAndroid Build Coastguard Worker                                   arg11)                          \
1102*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1103*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1104*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
1105*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1106*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1107*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1108*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1109*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1110*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1111*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1112*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1113*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1114*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1115*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1116*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
1117*635a8641SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
1118*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1119*635a8641SAndroid Build Coastguard Worker          "subl $4, %%esp\n\t"                                     \
1120*635a8641SAndroid Build Coastguard Worker          "pushl 44(%%eax)\n\t"                                    \
1121*635a8641SAndroid Build Coastguard Worker          "pushl 40(%%eax)\n\t"                                    \
1122*635a8641SAndroid Build Coastguard Worker          "pushl 36(%%eax)\n\t"                                    \
1123*635a8641SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1124*635a8641SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1125*635a8641SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1126*635a8641SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1127*635a8641SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1128*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1129*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1130*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1131*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1132*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1133*635a8641SAndroid Build Coastguard Worker          "addl $48, %%esp\n"                                      \
1134*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1135*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1136*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1137*635a8641SAndroid Build Coastguard Worker       );                                                          \
1138*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1139*635a8641SAndroid Build Coastguard Worker    } while (0)
1140*635a8641SAndroid Build Coastguard Worker 
1141*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
1142*635a8641SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
1143*635a8641SAndroid Build Coastguard Worker                                   arg11,arg12)                    \
1144*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1145*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1146*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
1147*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1148*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1149*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1150*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1151*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1152*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1153*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1154*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1155*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1156*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1157*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1158*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
1159*635a8641SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
1160*635a8641SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)(arg12);                       \
1161*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1162*635a8641SAndroid Build Coastguard Worker          "pushl 48(%%eax)\n\t"                                    \
1163*635a8641SAndroid Build Coastguard Worker          "pushl 44(%%eax)\n\t"                                    \
1164*635a8641SAndroid Build Coastguard Worker          "pushl 40(%%eax)\n\t"                                    \
1165*635a8641SAndroid Build Coastguard Worker          "pushl 36(%%eax)\n\t"                                    \
1166*635a8641SAndroid Build Coastguard Worker          "pushl 32(%%eax)\n\t"                                    \
1167*635a8641SAndroid Build Coastguard Worker          "pushl 28(%%eax)\n\t"                                    \
1168*635a8641SAndroid Build Coastguard Worker          "pushl 24(%%eax)\n\t"                                    \
1169*635a8641SAndroid Build Coastguard Worker          "pushl 20(%%eax)\n\t"                                    \
1170*635a8641SAndroid Build Coastguard Worker          "pushl 16(%%eax)\n\t"                                    \
1171*635a8641SAndroid Build Coastguard Worker          "pushl 12(%%eax)\n\t"                                    \
1172*635a8641SAndroid Build Coastguard Worker          "pushl 8(%%eax)\n\t"                                     \
1173*635a8641SAndroid Build Coastguard Worker          "pushl 4(%%eax)\n\t"                                     \
1174*635a8641SAndroid Build Coastguard Worker          "movl (%%eax), %%eax\n\t"  /* target->%eax */            \
1175*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_EAX                                \
1176*635a8641SAndroid Build Coastguard Worker          "addl $48, %%esp\n"                                      \
1177*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1178*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0])                            \
1179*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1180*635a8641SAndroid Build Coastguard Worker       );                                                          \
1181*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1182*635a8641SAndroid Build Coastguard Worker    } while (0)
1183*635a8641SAndroid Build Coastguard Worker 
1184*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_x86_linux || PLAT_x86_darwin */
1185*635a8641SAndroid Build Coastguard Worker 
1186*635a8641SAndroid Build Coastguard Worker /* ------------------------ amd64-{linux,darwin} --------------- */
1187*635a8641SAndroid Build Coastguard Worker 
1188*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_amd64_linux)  ||  defined(PLAT_amd64_darwin)
1189*635a8641SAndroid Build Coastguard Worker 
1190*635a8641SAndroid Build Coastguard Worker /* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */
1191*635a8641SAndroid Build Coastguard Worker 
1192*635a8641SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
1193*635a8641SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi",       \
1194*635a8641SAndroid Build Coastguard Worker                             "rdi", "r8", "r9", "r10", "r11"
1195*635a8641SAndroid Build Coastguard Worker 
1196*635a8641SAndroid Build Coastguard Worker /* This is all pretty complex.  It's so as to make stack unwinding
1197*635a8641SAndroid Build Coastguard Worker    work reliably.  See bug 243270.  The basic problem is the sub and
1198*635a8641SAndroid Build Coastguard Worker    add of 128 of %rsp in all of the following macros.  If gcc believes
1199*635a8641SAndroid Build Coastguard Worker    the CFA is in %rsp, then unwinding may fail, because what's at the
1200*635a8641SAndroid Build Coastguard Worker    CFA is not what gcc "expected" when it constructs the CFIs for the
1201*635a8641SAndroid Build Coastguard Worker    places where the macros are instantiated.
1202*635a8641SAndroid Build Coastguard Worker 
1203*635a8641SAndroid Build Coastguard Worker    But we can't just add a CFI annotation to increase the CFA offset
1204*635a8641SAndroid Build Coastguard Worker    by 128, to match the sub of 128 from %rsp, because we don't know
1205*635a8641SAndroid Build Coastguard Worker    whether gcc has chosen %rsp as the CFA at that point, or whether it
1206*635a8641SAndroid Build Coastguard Worker    has chosen some other register (eg, %rbp).  In the latter case,
1207*635a8641SAndroid Build Coastguard Worker    adding a CFI annotation to change the CFA offset is simply wrong.
1208*635a8641SAndroid Build Coastguard Worker 
1209*635a8641SAndroid Build Coastguard Worker    So the solution is to get hold of the CFA using
1210*635a8641SAndroid Build Coastguard Worker    __builtin_dwarf_cfa(), put it in a known register, and add a
1211*635a8641SAndroid Build Coastguard Worker    CFI annotation to say what the register is.  We choose %rbp for
1212*635a8641SAndroid Build Coastguard Worker    this (perhaps perversely), because:
1213*635a8641SAndroid Build Coastguard Worker 
1214*635a8641SAndroid Build Coastguard Worker    (1) %rbp is already subject to unwinding.  If a new register was
1215*635a8641SAndroid Build Coastguard Worker        chosen then the unwinder would have to unwind it in all stack
1216*635a8641SAndroid Build Coastguard Worker        traces, which is expensive, and
1217*635a8641SAndroid Build Coastguard Worker 
1218*635a8641SAndroid Build Coastguard Worker    (2) %rbp is already subject to precise exception updates in the
1219*635a8641SAndroid Build Coastguard Worker        JIT.  If a new register was chosen, we'd have to have precise
1220*635a8641SAndroid Build Coastguard Worker        exceptions for it too, which reduces performance of the
1221*635a8641SAndroid Build Coastguard Worker        generated code.
1222*635a8641SAndroid Build Coastguard Worker 
1223*635a8641SAndroid Build Coastguard Worker    However .. one extra complication.  We can't just whack the result
1224*635a8641SAndroid Build Coastguard Worker    of __builtin_dwarf_cfa() into %rbp and then add %rbp to the
1225*635a8641SAndroid Build Coastguard Worker    list of trashed registers at the end of the inline assembly
1226*635a8641SAndroid Build Coastguard Worker    fragments; gcc won't allow %rbp to appear in that list.  Hence
1227*635a8641SAndroid Build Coastguard Worker    instead we need to stash %rbp in %r15 for the duration of the asm,
1228*635a8641SAndroid Build Coastguard Worker    and say that %r15 is trashed instead.  gcc seems happy to go with
1229*635a8641SAndroid Build Coastguard Worker    that.
1230*635a8641SAndroid Build Coastguard Worker 
1231*635a8641SAndroid Build Coastguard Worker    Oh .. and this all needs to be conditionalised so that it is
1232*635a8641SAndroid Build Coastguard Worker    unchanged from before this commit, when compiled with older gccs
1233*635a8641SAndroid Build Coastguard Worker    that don't support __builtin_dwarf_cfa.  Furthermore, since
1234*635a8641SAndroid Build Coastguard Worker    this header file is freestanding, it has to be independent of
1235*635a8641SAndroid Build Coastguard Worker    config.h, and so the following conditionalisation cannot depend on
1236*635a8641SAndroid Build Coastguard Worker    configure time checks.
1237*635a8641SAndroid Build Coastguard Worker 
1238*635a8641SAndroid Build Coastguard Worker    Although it's not clear from
1239*635a8641SAndroid Build Coastguard Worker    'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)',
1240*635a8641SAndroid Build Coastguard Worker    this expression excludes Darwin.
1241*635a8641SAndroid Build Coastguard Worker    .cfi directives in Darwin assembly appear to be completely
1242*635a8641SAndroid Build Coastguard Worker    different and I haven't investigated how they work.
1243*635a8641SAndroid Build Coastguard Worker 
1244*635a8641SAndroid Build Coastguard Worker    For even more entertainment value, note we have to use the
1245*635a8641SAndroid Build Coastguard Worker    completely undocumented __builtin_dwarf_cfa(), which appears to
1246*635a8641SAndroid Build Coastguard Worker    really compute the CFA, whereas __builtin_frame_address(0) claims
1247*635a8641SAndroid Build Coastguard Worker    to but actually doesn't.  See
1248*635a8641SAndroid Build Coastguard Worker    https://bugs.kde.org/show_bug.cgi?id=243270#c47
1249*635a8641SAndroid Build Coastguard Worker */
1250*635a8641SAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
1251*635a8641SAndroid Build Coastguard Worker #  define __FRAME_POINTER                                         \
1252*635a8641SAndroid Build Coastguard Worker       ,"r"(__builtin_dwarf_cfa())
1253*635a8641SAndroid Build Coastguard Worker #  define VALGRIND_CFI_PROLOGUE                                   \
1254*635a8641SAndroid Build Coastguard Worker       "movq %%rbp, %%r15\n\t"                                     \
1255*635a8641SAndroid Build Coastguard Worker       "movq %2, %%rbp\n\t"                                        \
1256*635a8641SAndroid Build Coastguard Worker       ".cfi_remember_state\n\t"                                   \
1257*635a8641SAndroid Build Coastguard Worker       ".cfi_def_cfa rbp, 0\n\t"
1258*635a8641SAndroid Build Coastguard Worker #  define VALGRIND_CFI_EPILOGUE                                   \
1259*635a8641SAndroid Build Coastguard Worker       "movq %%r15, %%rbp\n\t"                                     \
1260*635a8641SAndroid Build Coastguard Worker       ".cfi_restore_state\n\t"
1261*635a8641SAndroid Build Coastguard Worker #else
1262*635a8641SAndroid Build Coastguard Worker #  define __FRAME_POINTER
1263*635a8641SAndroid Build Coastguard Worker #  define VALGRIND_CFI_PROLOGUE
1264*635a8641SAndroid Build Coastguard Worker #  define VALGRIND_CFI_EPILOGUE
1265*635a8641SAndroid Build Coastguard Worker #endif
1266*635a8641SAndroid Build Coastguard Worker 
1267*635a8641SAndroid Build Coastguard Worker 
1268*635a8641SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned
1269*635a8641SAndroid Build Coastguard Worker    long) == 8. */
1270*635a8641SAndroid Build Coastguard Worker 
1271*635a8641SAndroid Build Coastguard Worker /* NB 9 Sept 07.  There is a nasty kludge here in all these CALL_FN_
1272*635a8641SAndroid Build Coastguard Worker    macros.  In order not to trash the stack redzone, we need to drop
1273*635a8641SAndroid Build Coastguard Worker    %rsp by 128 before the hidden call, and restore afterwards.  The
1274*635a8641SAndroid Build Coastguard Worker    nastyness is that it is only by luck that the stack still appears
1275*635a8641SAndroid Build Coastguard Worker    to be unwindable during the hidden call - since then the behaviour
1276*635a8641SAndroid Build Coastguard Worker    of any routine using this macro does not match what the CFI data
1277*635a8641SAndroid Build Coastguard Worker    says.  Sigh.
1278*635a8641SAndroid Build Coastguard Worker 
1279*635a8641SAndroid Build Coastguard Worker    Why is this important?  Imagine that a wrapper has a stack
1280*635a8641SAndroid Build Coastguard Worker    allocated local, and passes to the hidden call, a pointer to it.
1281*635a8641SAndroid Build Coastguard Worker    Because gcc does not know about the hidden call, it may allocate
1282*635a8641SAndroid Build Coastguard Worker    that local in the redzone.  Unfortunately the hidden call may then
1283*635a8641SAndroid Build Coastguard Worker    trash it before it comes to use it.  So we must step clear of the
1284*635a8641SAndroid Build Coastguard Worker    redzone, for the duration of the hidden call, to make it safe.
1285*635a8641SAndroid Build Coastguard Worker 
1286*635a8641SAndroid Build Coastguard Worker    Probably the same problem afflicts the other redzone-style ABIs too
1287*635a8641SAndroid Build Coastguard Worker    (ppc64-linux, ppc32-aix5, ppc64-aix5); but for those, the stack is
1288*635a8641SAndroid Build Coastguard Worker    self describing (none of this CFI nonsense) so at least messing
1289*635a8641SAndroid Build Coastguard Worker    with the stack pointer doesn't give a danger of non-unwindable
1290*635a8641SAndroid Build Coastguard Worker    stack. */
1291*635a8641SAndroid Build Coastguard Worker 
1292*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
1293*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1294*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1295*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
1296*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1297*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1298*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1299*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1300*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1301*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1302*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1303*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1304*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1305*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1306*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1307*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1308*635a8641SAndroid Build Coastguard Worker       );                                                          \
1309*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1310*635a8641SAndroid Build Coastguard Worker    } while (0)
1311*635a8641SAndroid Build Coastguard Worker 
1312*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
1313*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1314*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1315*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                          \
1316*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1317*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1318*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1319*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1320*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1321*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1322*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1323*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1324*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1325*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1326*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1327*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1328*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1329*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1330*635a8641SAndroid Build Coastguard Worker       );                                                          \
1331*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1332*635a8641SAndroid Build Coastguard Worker    } while (0)
1333*635a8641SAndroid Build Coastguard Worker 
1334*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
1335*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1336*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1337*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
1338*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1339*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1340*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1341*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1342*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1343*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1344*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1345*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1346*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1347*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1348*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1349*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1350*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1351*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1352*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1353*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1354*635a8641SAndroid Build Coastguard Worker       );                                                          \
1355*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1356*635a8641SAndroid Build Coastguard Worker    } while (0)
1357*635a8641SAndroid Build Coastguard Worker 
1358*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
1359*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1360*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1361*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
1362*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1363*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1364*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1365*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1366*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1367*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1368*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1369*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1370*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1371*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1372*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1373*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1374*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1375*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1376*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1377*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1378*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1379*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1380*635a8641SAndroid Build Coastguard Worker       );                                                          \
1381*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1382*635a8641SAndroid Build Coastguard Worker    } while (0)
1383*635a8641SAndroid Build Coastguard Worker 
1384*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
1385*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1386*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1387*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
1388*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1389*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1390*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1391*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1392*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1393*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1394*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1395*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1396*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1397*635a8641SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                              \
1398*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1399*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1400*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1401*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1402*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1403*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1404*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1405*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1406*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1407*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1408*635a8641SAndroid Build Coastguard Worker       );                                                          \
1409*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1410*635a8641SAndroid Build Coastguard Worker    } while (0)
1411*635a8641SAndroid Build Coastguard Worker 
1412*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
1413*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1414*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1415*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
1416*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1417*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1418*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1419*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1420*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1421*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1422*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1423*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1424*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1425*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1426*635a8641SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                               \
1427*635a8641SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                              \
1428*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1429*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1430*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1431*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1432*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1433*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1434*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1435*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1436*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1437*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1438*635a8641SAndroid Build Coastguard Worker       );                                                          \
1439*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1440*635a8641SAndroid Build Coastguard Worker    } while (0)
1441*635a8641SAndroid Build Coastguard Worker 
1442*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
1443*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1444*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1445*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
1446*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1447*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1448*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1449*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1450*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1451*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1452*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1453*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1454*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1455*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1456*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1457*635a8641SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                               \
1458*635a8641SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                               \
1459*635a8641SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                              \
1460*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1461*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1462*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1463*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1464*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1465*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1466*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1467*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1468*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1469*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1470*635a8641SAndroid Build Coastguard Worker       );                                                          \
1471*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1472*635a8641SAndroid Build Coastguard Worker    } while (0)
1473*635a8641SAndroid Build Coastguard Worker 
1474*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1475*635a8641SAndroid Build Coastguard Worker                                  arg7)                            \
1476*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1477*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1478*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
1479*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1480*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1481*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1482*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1483*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1484*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1485*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1486*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1487*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1488*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1489*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1490*635a8641SAndroid Build Coastguard Worker          "subq $136,%%rsp\n\t"                                    \
1491*635a8641SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                    \
1492*635a8641SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                               \
1493*635a8641SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                               \
1494*635a8641SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                              \
1495*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1496*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1497*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1498*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1499*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1500*635a8641SAndroid Build Coastguard Worker          "addq $8, %%rsp\n"                                       \
1501*635a8641SAndroid Build Coastguard Worker          "addq $136,%%rsp\n\t"                                    \
1502*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1503*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1504*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1505*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1506*635a8641SAndroid Build Coastguard Worker       );                                                          \
1507*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1508*635a8641SAndroid Build Coastguard Worker    } while (0)
1509*635a8641SAndroid Build Coastguard Worker 
1510*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1511*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
1512*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1513*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1514*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
1515*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1516*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1517*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1518*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1519*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1520*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1521*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1522*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1523*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1524*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1525*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1526*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1527*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1528*635a8641SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                    \
1529*635a8641SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                    \
1530*635a8641SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                               \
1531*635a8641SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                               \
1532*635a8641SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                              \
1533*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1534*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1535*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1536*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1537*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1538*635a8641SAndroid Build Coastguard Worker          "addq $16, %%rsp\n"                                      \
1539*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1540*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1541*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1542*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1543*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1544*635a8641SAndroid Build Coastguard Worker       );                                                          \
1545*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1546*635a8641SAndroid Build Coastguard Worker    } while (0)
1547*635a8641SAndroid Build Coastguard Worker 
1548*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1549*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
1550*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1551*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1552*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
1553*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1554*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1555*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1556*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1557*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1558*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1559*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1560*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1561*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1562*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1563*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1564*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1565*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1566*635a8641SAndroid Build Coastguard Worker          "subq $136,%%rsp\n\t"                                    \
1567*635a8641SAndroid Build Coastguard Worker          "pushq 72(%%rax)\n\t"                                    \
1568*635a8641SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                    \
1569*635a8641SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                    \
1570*635a8641SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                               \
1571*635a8641SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                               \
1572*635a8641SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                              \
1573*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1574*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1575*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1576*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1577*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1578*635a8641SAndroid Build Coastguard Worker          "addq $24, %%rsp\n"                                      \
1579*635a8641SAndroid Build Coastguard Worker          "addq $136,%%rsp\n\t"                                    \
1580*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1581*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1582*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1583*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1584*635a8641SAndroid Build Coastguard Worker       );                                                          \
1585*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1586*635a8641SAndroid Build Coastguard Worker    } while (0)
1587*635a8641SAndroid Build Coastguard Worker 
1588*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
1589*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
1590*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1591*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1592*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
1593*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1594*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1595*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1596*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1597*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1598*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1599*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1600*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1601*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1602*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1603*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1604*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
1605*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1606*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1607*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1608*635a8641SAndroid Build Coastguard Worker          "pushq 80(%%rax)\n\t"                                    \
1609*635a8641SAndroid Build Coastguard Worker          "pushq 72(%%rax)\n\t"                                    \
1610*635a8641SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                    \
1611*635a8641SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                    \
1612*635a8641SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                               \
1613*635a8641SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                               \
1614*635a8641SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                              \
1615*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1616*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1617*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1618*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1619*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1620*635a8641SAndroid Build Coastguard Worker          "addq $32, %%rsp\n"                                      \
1621*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1622*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1623*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1624*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1625*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1626*635a8641SAndroid Build Coastguard Worker       );                                                          \
1627*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1628*635a8641SAndroid Build Coastguard Worker    } while (0)
1629*635a8641SAndroid Build Coastguard Worker 
1630*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
1631*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)     \
1632*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1633*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1634*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
1635*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1636*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1637*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1638*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1639*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1640*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1641*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1642*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1643*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1644*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1645*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1646*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
1647*635a8641SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
1648*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1649*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1650*635a8641SAndroid Build Coastguard Worker          "subq $136,%%rsp\n\t"                                    \
1651*635a8641SAndroid Build Coastguard Worker          "pushq 88(%%rax)\n\t"                                    \
1652*635a8641SAndroid Build Coastguard Worker          "pushq 80(%%rax)\n\t"                                    \
1653*635a8641SAndroid Build Coastguard Worker          "pushq 72(%%rax)\n\t"                                    \
1654*635a8641SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                    \
1655*635a8641SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                    \
1656*635a8641SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                               \
1657*635a8641SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                               \
1658*635a8641SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                              \
1659*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1660*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1661*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1662*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1663*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1664*635a8641SAndroid Build Coastguard Worker          "addq $40, %%rsp\n"                                      \
1665*635a8641SAndroid Build Coastguard Worker          "addq $136,%%rsp\n\t"                                    \
1666*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1667*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1668*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1669*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1670*635a8641SAndroid Build Coastguard Worker       );                                                          \
1671*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1672*635a8641SAndroid Build Coastguard Worker    } while (0)
1673*635a8641SAndroid Build Coastguard Worker 
1674*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
1675*635a8641SAndroid Build Coastguard Worker                                 arg7,arg8,arg9,arg10,arg11,arg12) \
1676*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1677*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1678*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
1679*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1680*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1681*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
1682*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
1683*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
1684*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
1685*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
1686*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
1687*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
1688*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
1689*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
1690*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
1691*635a8641SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
1692*635a8641SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)(arg12);                       \
1693*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1694*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_PROLOGUE                                    \
1695*635a8641SAndroid Build Coastguard Worker          "subq $128,%%rsp\n\t"                                    \
1696*635a8641SAndroid Build Coastguard Worker          "pushq 96(%%rax)\n\t"                                    \
1697*635a8641SAndroid Build Coastguard Worker          "pushq 88(%%rax)\n\t"                                    \
1698*635a8641SAndroid Build Coastguard Worker          "pushq 80(%%rax)\n\t"                                    \
1699*635a8641SAndroid Build Coastguard Worker          "pushq 72(%%rax)\n\t"                                    \
1700*635a8641SAndroid Build Coastguard Worker          "pushq 64(%%rax)\n\t"                                    \
1701*635a8641SAndroid Build Coastguard Worker          "pushq 56(%%rax)\n\t"                                    \
1702*635a8641SAndroid Build Coastguard Worker          "movq 48(%%rax), %%r9\n\t"                               \
1703*635a8641SAndroid Build Coastguard Worker          "movq 40(%%rax), %%r8\n\t"                               \
1704*635a8641SAndroid Build Coastguard Worker          "movq 32(%%rax), %%rcx\n\t"                              \
1705*635a8641SAndroid Build Coastguard Worker          "movq 24(%%rax), %%rdx\n\t"                              \
1706*635a8641SAndroid Build Coastguard Worker          "movq 16(%%rax), %%rsi\n\t"                              \
1707*635a8641SAndroid Build Coastguard Worker          "movq 8(%%rax), %%rdi\n\t"                               \
1708*635a8641SAndroid Build Coastguard Worker          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
1709*635a8641SAndroid Build Coastguard Worker          VALGRIND_CALL_NOREDIR_RAX                                \
1710*635a8641SAndroid Build Coastguard Worker          "addq $48, %%rsp\n"                                      \
1711*635a8641SAndroid Build Coastguard Worker          "addq $128,%%rsp\n\t"                                    \
1712*635a8641SAndroid Build Coastguard Worker          VALGRIND_CFI_EPILOGUE                                    \
1713*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=a" (_res)                                  \
1714*635a8641SAndroid Build Coastguard Worker          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER            \
1715*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15"   \
1716*635a8641SAndroid Build Coastguard Worker       );                                                          \
1717*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1718*635a8641SAndroid Build Coastguard Worker    } while (0)
1719*635a8641SAndroid Build Coastguard Worker 
1720*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
1721*635a8641SAndroid Build Coastguard Worker 
1722*635a8641SAndroid Build Coastguard Worker /* ------------------------ ppc32-linux ------------------------ */
1723*635a8641SAndroid Build Coastguard Worker 
1724*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_ppc32_linux)
1725*635a8641SAndroid Build Coastguard Worker 
1726*635a8641SAndroid Build Coastguard Worker /* This is useful for finding out about the on-stack stuff:
1727*635a8641SAndroid Build Coastguard Worker 
1728*635a8641SAndroid Build Coastguard Worker    extern int f9  ( int,int,int,int,int,int,int,int,int );
1729*635a8641SAndroid Build Coastguard Worker    extern int f10 ( int,int,int,int,int,int,int,int,int,int );
1730*635a8641SAndroid Build Coastguard Worker    extern int f11 ( int,int,int,int,int,int,int,int,int,int,int );
1731*635a8641SAndroid Build Coastguard Worker    extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int );
1732*635a8641SAndroid Build Coastguard Worker 
1733*635a8641SAndroid Build Coastguard Worker    int g9 ( void ) {
1734*635a8641SAndroid Build Coastguard Worker       return f9(11,22,33,44,55,66,77,88,99);
1735*635a8641SAndroid Build Coastguard Worker    }
1736*635a8641SAndroid Build Coastguard Worker    int g10 ( void ) {
1737*635a8641SAndroid Build Coastguard Worker       return f10(11,22,33,44,55,66,77,88,99,110);
1738*635a8641SAndroid Build Coastguard Worker    }
1739*635a8641SAndroid Build Coastguard Worker    int g11 ( void ) {
1740*635a8641SAndroid Build Coastguard Worker       return f11(11,22,33,44,55,66,77,88,99,110,121);
1741*635a8641SAndroid Build Coastguard Worker    }
1742*635a8641SAndroid Build Coastguard Worker    int g12 ( void ) {
1743*635a8641SAndroid Build Coastguard Worker       return f12(11,22,33,44,55,66,77,88,99,110,121,132);
1744*635a8641SAndroid Build Coastguard Worker    }
1745*635a8641SAndroid Build Coastguard Worker */
1746*635a8641SAndroid Build Coastguard Worker 
1747*635a8641SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
1748*635a8641SAndroid Build Coastguard Worker 
1749*635a8641SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
1750*635a8641SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS                                       \
1751*635a8641SAndroid Build Coastguard Worker    "lr", "ctr", "xer",                                            \
1752*635a8641SAndroid Build Coastguard Worker    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
1753*635a8641SAndroid Build Coastguard Worker    "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
1754*635a8641SAndroid Build Coastguard Worker    "r11", "r12", "r13"
1755*635a8641SAndroid Build Coastguard Worker 
1756*635a8641SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc32-linux,
1757*635a8641SAndroid Build Coastguard Worker    sizeof(unsigned long) == 4. */
1758*635a8641SAndroid Build Coastguard Worker 
1759*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
1760*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1761*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1762*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
1763*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1764*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1765*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1766*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
1767*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
1768*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
1769*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
1770*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
1771*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
1772*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1773*635a8641SAndroid Build Coastguard Worker       );                                                          \
1774*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1775*635a8641SAndroid Build Coastguard Worker    } while (0)
1776*635a8641SAndroid Build Coastguard Worker 
1777*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
1778*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1779*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1780*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                          \
1781*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1782*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1783*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
1784*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1785*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
1786*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
1787*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
1788*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
1789*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
1790*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
1791*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
1792*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1793*635a8641SAndroid Build Coastguard Worker       );                                                          \
1794*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1795*635a8641SAndroid Build Coastguard Worker    } while (0)
1796*635a8641SAndroid Build Coastguard Worker 
1797*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
1798*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1799*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1800*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
1801*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1802*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1803*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
1804*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
1805*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1806*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
1807*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
1808*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
1809*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
1810*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
1811*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
1812*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
1813*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
1814*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1815*635a8641SAndroid Build Coastguard Worker       );                                                          \
1816*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1817*635a8641SAndroid Build Coastguard Worker    } while (0)
1818*635a8641SAndroid Build Coastguard Worker 
1819*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
1820*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1821*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1822*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
1823*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1824*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1825*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
1826*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
1827*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
1828*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1829*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
1830*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
1831*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
1832*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
1833*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
1834*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
1835*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
1836*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
1837*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
1838*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1839*635a8641SAndroid Build Coastguard Worker       );                                                          \
1840*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1841*635a8641SAndroid Build Coastguard Worker    } while (0)
1842*635a8641SAndroid Build Coastguard Worker 
1843*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
1844*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1845*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1846*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
1847*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1848*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1849*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
1850*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
1851*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
1852*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
1853*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1854*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
1855*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
1856*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
1857*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
1858*635a8641SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
1859*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
1860*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
1861*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
1862*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
1863*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
1864*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1865*635a8641SAndroid Build Coastguard Worker       );                                                          \
1866*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1867*635a8641SAndroid Build Coastguard Worker    } while (0)
1868*635a8641SAndroid Build Coastguard Worker 
1869*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
1870*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1871*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1872*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
1873*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1874*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1875*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
1876*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
1877*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
1878*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
1879*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
1880*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1881*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
1882*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
1883*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
1884*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
1885*635a8641SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
1886*635a8641SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
1887*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
1888*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
1889*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
1890*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
1891*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
1892*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1893*635a8641SAndroid Build Coastguard Worker       );                                                          \
1894*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1895*635a8641SAndroid Build Coastguard Worker    } while (0)
1896*635a8641SAndroid Build Coastguard Worker 
1897*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
1898*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1899*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1900*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
1901*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1902*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1903*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
1904*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
1905*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
1906*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
1907*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
1908*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
1909*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1910*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
1911*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
1912*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
1913*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
1914*635a8641SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
1915*635a8641SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
1916*635a8641SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
1917*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
1918*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
1919*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
1920*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
1921*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
1922*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1923*635a8641SAndroid Build Coastguard Worker       );                                                          \
1924*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1925*635a8641SAndroid Build Coastguard Worker    } while (0)
1926*635a8641SAndroid Build Coastguard Worker 
1927*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1928*635a8641SAndroid Build Coastguard Worker                                  arg7)                            \
1929*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1930*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1931*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
1932*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1933*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1934*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
1935*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
1936*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
1937*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
1938*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
1939*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
1940*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
1941*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1942*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
1943*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
1944*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
1945*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
1946*635a8641SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
1947*635a8641SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
1948*635a8641SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
1949*635a8641SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
1950*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
1951*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
1952*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
1953*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
1954*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
1955*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1956*635a8641SAndroid Build Coastguard Worker       );                                                          \
1957*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1958*635a8641SAndroid Build Coastguard Worker    } while (0)
1959*635a8641SAndroid Build Coastguard Worker 
1960*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1961*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
1962*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1963*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1964*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
1965*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
1966*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
1967*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
1968*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
1969*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
1970*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
1971*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
1972*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
1973*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
1974*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
1975*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
1976*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
1977*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
1978*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
1979*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
1980*635a8641SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
1981*635a8641SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
1982*635a8641SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
1983*635a8641SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
1984*635a8641SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
1985*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
1986*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
1987*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
1988*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
1989*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
1990*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
1991*635a8641SAndroid Build Coastguard Worker       );                                                          \
1992*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
1993*635a8641SAndroid Build Coastguard Worker    } while (0)
1994*635a8641SAndroid Build Coastguard Worker 
1995*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
1996*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
1997*635a8641SAndroid Build Coastguard Worker    do {                                                           \
1998*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
1999*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
2000*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2001*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2002*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2003*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2004*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2005*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2006*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2007*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2008*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2009*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
2010*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                           \
2011*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2012*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2013*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-16\n\t"                                       \
2014*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
2015*635a8641SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
2016*635a8641SAndroid Build Coastguard Worker          "stw 3,8(1)\n\t"                                         \
2017*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2018*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2019*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2020*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2021*635a8641SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2022*635a8641SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2023*635a8641SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2024*635a8641SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2025*635a8641SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2026*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2027*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2028*635a8641SAndroid Build Coastguard Worker          "addi 1,1,16\n\t"                                        \
2029*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2030*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2031*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2032*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2033*635a8641SAndroid Build Coastguard Worker       );                                                          \
2034*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2035*635a8641SAndroid Build Coastguard Worker    } while (0)
2036*635a8641SAndroid Build Coastguard Worker 
2037*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2038*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
2039*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2040*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2041*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
2042*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2043*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2044*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2045*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2046*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2047*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2048*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2049*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2050*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2051*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
2052*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                           \
2053*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)arg10;                         \
2054*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2055*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2056*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-16\n\t"                                       \
2057*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
2058*635a8641SAndroid Build Coastguard Worker          "lwz 3,40(11)\n\t"                                       \
2059*635a8641SAndroid Build Coastguard Worker          "stw 3,12(1)\n\t"                                        \
2060*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
2061*635a8641SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
2062*635a8641SAndroid Build Coastguard Worker          "stw 3,8(1)\n\t"                                         \
2063*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2064*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2065*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2066*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2067*635a8641SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2068*635a8641SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2069*635a8641SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2070*635a8641SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2071*635a8641SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2072*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2073*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2074*635a8641SAndroid Build Coastguard Worker          "addi 1,1,16\n\t"                                        \
2075*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2076*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2077*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2078*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2079*635a8641SAndroid Build Coastguard Worker       );                                                          \
2080*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2081*635a8641SAndroid Build Coastguard Worker    } while (0)
2082*635a8641SAndroid Build Coastguard Worker 
2083*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2084*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)     \
2085*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2086*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2087*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
2088*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2089*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2090*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2091*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2092*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2093*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2094*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2095*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2096*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2097*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
2098*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                           \
2099*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)arg10;                         \
2100*635a8641SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)arg11;                         \
2101*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2102*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2103*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-32\n\t"                                       \
2104*635a8641SAndroid Build Coastguard Worker          /* arg11 */                                              \
2105*635a8641SAndroid Build Coastguard Worker          "lwz 3,44(11)\n\t"                                       \
2106*635a8641SAndroid Build Coastguard Worker          "stw 3,16(1)\n\t"                                        \
2107*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
2108*635a8641SAndroid Build Coastguard Worker          "lwz 3,40(11)\n\t"                                       \
2109*635a8641SAndroid Build Coastguard Worker          "stw 3,12(1)\n\t"                                        \
2110*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
2111*635a8641SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
2112*635a8641SAndroid Build Coastguard Worker          "stw 3,8(1)\n\t"                                         \
2113*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2114*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2115*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2116*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2117*635a8641SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2118*635a8641SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2119*635a8641SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2120*635a8641SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2121*635a8641SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2122*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2123*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2124*635a8641SAndroid Build Coastguard Worker          "addi 1,1,32\n\t"                                        \
2125*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2126*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2127*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2128*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2129*635a8641SAndroid Build Coastguard Worker       );                                                          \
2130*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2131*635a8641SAndroid Build Coastguard Worker    } while (0)
2132*635a8641SAndroid Build Coastguard Worker 
2133*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2134*635a8641SAndroid Build Coastguard Worker                                 arg7,arg8,arg9,arg10,arg11,arg12) \
2135*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2136*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2137*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
2138*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2139*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2140*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)arg1;                           \
2141*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)arg2;                           \
2142*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)arg3;                           \
2143*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)arg4;                           \
2144*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)arg5;                           \
2145*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)arg6;                           \
2146*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)arg7;                           \
2147*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)arg8;                           \
2148*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)arg9;                           \
2149*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)arg10;                         \
2150*635a8641SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)arg11;                         \
2151*635a8641SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)arg12;                         \
2152*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2153*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2154*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-32\n\t"                                       \
2155*635a8641SAndroid Build Coastguard Worker          /* arg12 */                                              \
2156*635a8641SAndroid Build Coastguard Worker          "lwz 3,48(11)\n\t"                                       \
2157*635a8641SAndroid Build Coastguard Worker          "stw 3,20(1)\n\t"                                        \
2158*635a8641SAndroid Build Coastguard Worker          /* arg11 */                                              \
2159*635a8641SAndroid Build Coastguard Worker          "lwz 3,44(11)\n\t"                                       \
2160*635a8641SAndroid Build Coastguard Worker          "stw 3,16(1)\n\t"                                        \
2161*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
2162*635a8641SAndroid Build Coastguard Worker          "lwz 3,40(11)\n\t"                                       \
2163*635a8641SAndroid Build Coastguard Worker          "stw 3,12(1)\n\t"                                        \
2164*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
2165*635a8641SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
2166*635a8641SAndroid Build Coastguard Worker          "stw 3,8(1)\n\t"                                         \
2167*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2168*635a8641SAndroid Build Coastguard Worker          "lwz 3,4(11)\n\t"   /* arg1->r3 */                       \
2169*635a8641SAndroid Build Coastguard Worker          "lwz 4,8(11)\n\t"                                        \
2170*635a8641SAndroid Build Coastguard Worker          "lwz 5,12(11)\n\t"                                       \
2171*635a8641SAndroid Build Coastguard Worker          "lwz 6,16(11)\n\t"  /* arg4->r6 */                       \
2172*635a8641SAndroid Build Coastguard Worker          "lwz 7,20(11)\n\t"                                       \
2173*635a8641SAndroid Build Coastguard Worker          "lwz 8,24(11)\n\t"                                       \
2174*635a8641SAndroid Build Coastguard Worker          "lwz 9,28(11)\n\t"                                       \
2175*635a8641SAndroid Build Coastguard Worker          "lwz 10,32(11)\n\t" /* arg8->r10 */                      \
2176*635a8641SAndroid Build Coastguard Worker          "lwz 11,0(11)\n\t"  /* target->r11 */                    \
2177*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2178*635a8641SAndroid Build Coastguard Worker          "addi 1,1,32\n\t"                                        \
2179*635a8641SAndroid Build Coastguard Worker          "mr %0,3"                                                \
2180*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2181*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[0])                            \
2182*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2183*635a8641SAndroid Build Coastguard Worker       );                                                          \
2184*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2185*635a8641SAndroid Build Coastguard Worker    } while (0)
2186*635a8641SAndroid Build Coastguard Worker 
2187*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_ppc32_linux */
2188*635a8641SAndroid Build Coastguard Worker 
2189*635a8641SAndroid Build Coastguard Worker /* ------------------------ ppc64-linux ------------------------ */
2190*635a8641SAndroid Build Coastguard Worker 
2191*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_ppc64_linux)
2192*635a8641SAndroid Build Coastguard Worker 
2193*635a8641SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
2194*635a8641SAndroid Build Coastguard Worker 
2195*635a8641SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
2196*635a8641SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS                                       \
2197*635a8641SAndroid Build Coastguard Worker    "lr", "ctr", "xer",                                            \
2198*635a8641SAndroid Build Coastguard Worker    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
2199*635a8641SAndroid Build Coastguard Worker    "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
2200*635a8641SAndroid Build Coastguard Worker    "r11", "r12", "r13"
2201*635a8641SAndroid Build Coastguard Worker 
2202*635a8641SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
2203*635a8641SAndroid Build Coastguard Worker    long) == 8. */
2204*635a8641SAndroid Build Coastguard Worker 
2205*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
2206*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2207*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2208*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+0];                        \
2209*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2210*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2211*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)_orig.r2;                       \
2212*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)_orig.nraddr;                   \
2213*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2214*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2215*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2216*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2217*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2218*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2219*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2220*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2221*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)" /* restore tocptr */                      \
2222*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2223*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2224*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2225*635a8641SAndroid Build Coastguard Worker       );                                                          \
2226*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2227*635a8641SAndroid Build Coastguard Worker    } while (0)
2228*635a8641SAndroid Build Coastguard Worker 
2229*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
2230*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2231*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2232*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+1];                        \
2233*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2234*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2235*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2236*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2237*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2238*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2239*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2240*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2241*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2242*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2243*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2244*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2245*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2246*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2247*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)" /* restore tocptr */                      \
2248*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2249*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2250*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2251*635a8641SAndroid Build Coastguard Worker       );                                                          \
2252*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2253*635a8641SAndroid Build Coastguard Worker    } while (0)
2254*635a8641SAndroid Build Coastguard Worker 
2255*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
2256*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2257*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2258*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+2];                        \
2259*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2260*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2261*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2262*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2263*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2264*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2265*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2266*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2267*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2268*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2269*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2270*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2271*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2272*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2273*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2274*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2275*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)" /* restore tocptr */                      \
2276*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2277*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2278*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2279*635a8641SAndroid Build Coastguard Worker       );                                                          \
2280*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2281*635a8641SAndroid Build Coastguard Worker    } while (0)
2282*635a8641SAndroid Build Coastguard Worker 
2283*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
2284*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2285*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2286*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+3];                        \
2287*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2288*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2289*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2290*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2291*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2292*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2293*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2294*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2295*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2296*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2297*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2298*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2299*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2300*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2301*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2302*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2303*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2304*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2305*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)" /* restore tocptr */                      \
2306*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2307*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2308*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2309*635a8641SAndroid Build Coastguard Worker       );                                                          \
2310*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2311*635a8641SAndroid Build Coastguard Worker    } while (0)
2312*635a8641SAndroid Build Coastguard Worker 
2313*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
2314*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2315*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2316*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+4];                        \
2317*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2318*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2319*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2320*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2321*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2322*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2323*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2324*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2325*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2326*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2327*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2328*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2329*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2330*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2331*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2332*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2333*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2334*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2335*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2336*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2337*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)" /* restore tocptr */                      \
2338*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2339*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2340*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2341*635a8641SAndroid Build Coastguard Worker       );                                                          \
2342*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2343*635a8641SAndroid Build Coastguard Worker    } while (0)
2344*635a8641SAndroid Build Coastguard Worker 
2345*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
2346*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2347*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2348*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+5];                        \
2349*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2350*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2351*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2352*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2353*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2354*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2355*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2356*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2357*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2358*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2359*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2360*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2361*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2362*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2363*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2364*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2365*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2366*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2367*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2368*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2369*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2370*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2371*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)" /* restore tocptr */                      \
2372*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2373*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2374*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2375*635a8641SAndroid Build Coastguard Worker       );                                                          \
2376*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2377*635a8641SAndroid Build Coastguard Worker    } while (0)
2378*635a8641SAndroid Build Coastguard Worker 
2379*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
2380*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2381*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2382*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+6];                        \
2383*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2384*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2385*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2386*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2387*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2388*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2389*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2390*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2391*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2392*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
2393*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2394*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2395*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2396*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2397*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2398*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2399*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2400*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2401*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2402*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2403*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2404*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2405*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2406*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2407*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)" /* restore tocptr */                      \
2408*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2409*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2410*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2411*635a8641SAndroid Build Coastguard Worker       );                                                          \
2412*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2413*635a8641SAndroid Build Coastguard Worker    } while (0)
2414*635a8641SAndroid Build Coastguard Worker 
2415*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2416*635a8641SAndroid Build Coastguard Worker                                  arg7)                            \
2417*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2418*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2419*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+7];                        \
2420*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2421*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2422*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2423*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2424*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2425*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2426*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2427*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2428*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2429*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
2430*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
2431*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2432*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2433*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2434*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2435*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2436*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2437*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2438*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2439*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2440*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2441*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2442*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2443*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2444*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2445*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2446*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)" /* restore tocptr */                      \
2447*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2448*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2449*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2450*635a8641SAndroid Build Coastguard Worker       );                                                          \
2451*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2452*635a8641SAndroid Build Coastguard Worker    } while (0)
2453*635a8641SAndroid Build Coastguard Worker 
2454*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2455*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
2456*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2457*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2458*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+8];                        \
2459*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2460*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2461*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2462*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2463*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2464*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2465*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2466*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2467*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2468*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
2469*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
2470*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
2471*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2472*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2473*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2474*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2475*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2476*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2477*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2478*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2479*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2480*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2481*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2482*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2483*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2484*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2485*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2486*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2487*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)" /* restore tocptr */                      \
2488*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2489*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2490*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2491*635a8641SAndroid Build Coastguard Worker       );                                                          \
2492*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2493*635a8641SAndroid Build Coastguard Worker    } while (0)
2494*635a8641SAndroid Build Coastguard Worker 
2495*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2496*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
2497*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2498*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2499*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+9];                        \
2500*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2501*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2502*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2503*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2504*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2505*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2506*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2507*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2508*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2509*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
2510*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
2511*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
2512*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
2513*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2514*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2515*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2516*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2517*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-128\n\t"  /* expand stack frame */            \
2518*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
2519*635a8641SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
2520*635a8641SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
2521*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2522*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2523*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2524*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2525*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2526*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2527*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2528*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2529*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2530*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2531*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2532*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2533*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2534*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2535*635a8641SAndroid Build Coastguard Worker          "addi 1,1,128"     /* restore frame */                   \
2536*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2537*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2538*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2539*635a8641SAndroid Build Coastguard Worker       );                                                          \
2540*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2541*635a8641SAndroid Build Coastguard Worker    } while (0)
2542*635a8641SAndroid Build Coastguard Worker 
2543*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2544*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
2545*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2546*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2547*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+10];                       \
2548*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2549*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2550*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2551*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2552*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2553*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2554*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2555*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2556*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2557*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
2558*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
2559*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
2560*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
2561*635a8641SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
2562*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2563*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2564*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2565*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2566*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-128\n\t"  /* expand stack frame */            \
2567*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
2568*635a8641SAndroid Build Coastguard Worker          "ld  3,80(11)\n\t"                                       \
2569*635a8641SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
2570*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
2571*635a8641SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
2572*635a8641SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
2573*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2574*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2575*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2576*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2577*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2578*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2579*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2580*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2581*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2582*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2583*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2584*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2585*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2586*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2587*635a8641SAndroid Build Coastguard Worker          "addi 1,1,128"     /* restore frame */                   \
2588*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2589*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2590*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2591*635a8641SAndroid Build Coastguard Worker       );                                                          \
2592*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2593*635a8641SAndroid Build Coastguard Worker    } while (0)
2594*635a8641SAndroid Build Coastguard Worker 
2595*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2596*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)     \
2597*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2598*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2599*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+11];                       \
2600*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2601*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2602*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2603*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2604*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2605*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2606*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2607*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2608*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2609*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
2610*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
2611*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
2612*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
2613*635a8641SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
2614*635a8641SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
2615*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2616*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2617*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2618*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2619*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-144\n\t"  /* expand stack frame */            \
2620*635a8641SAndroid Build Coastguard Worker          /* arg11 */                                              \
2621*635a8641SAndroid Build Coastguard Worker          "ld  3,88(11)\n\t"                                       \
2622*635a8641SAndroid Build Coastguard Worker          "std 3,128(1)\n\t"                                       \
2623*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
2624*635a8641SAndroid Build Coastguard Worker          "ld  3,80(11)\n\t"                                       \
2625*635a8641SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
2626*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
2627*635a8641SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
2628*635a8641SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
2629*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2630*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2631*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2632*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2633*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2634*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2635*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2636*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2637*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2638*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2639*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2640*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2641*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2642*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2643*635a8641SAndroid Build Coastguard Worker          "addi 1,1,144"     /* restore frame */                   \
2644*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2645*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2646*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2647*635a8641SAndroid Build Coastguard Worker       );                                                          \
2648*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2649*635a8641SAndroid Build Coastguard Worker    } while (0)
2650*635a8641SAndroid Build Coastguard Worker 
2651*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2652*635a8641SAndroid Build Coastguard Worker                                 arg7,arg8,arg9,arg10,arg11,arg12) \
2653*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2654*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2655*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+12];                       \
2656*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2657*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
2658*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
2659*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
2660*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
2661*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
2662*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
2663*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
2664*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
2665*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
2666*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
2667*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
2668*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
2669*635a8641SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
2670*635a8641SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
2671*635a8641SAndroid Build Coastguard Worker       _argvec[2+12] = (unsigned long)arg12;                       \
2672*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2673*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2674*635a8641SAndroid Build Coastguard Worker          "std 2,-16(11)\n\t"  /* save tocptr */                   \
2675*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
2676*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-144\n\t"  /* expand stack frame */            \
2677*635a8641SAndroid Build Coastguard Worker          /* arg12 */                                              \
2678*635a8641SAndroid Build Coastguard Worker          "ld  3,96(11)\n\t"                                       \
2679*635a8641SAndroid Build Coastguard Worker          "std 3,136(1)\n\t"                                       \
2680*635a8641SAndroid Build Coastguard Worker          /* arg11 */                                              \
2681*635a8641SAndroid Build Coastguard Worker          "ld  3,88(11)\n\t"                                       \
2682*635a8641SAndroid Build Coastguard Worker          "std 3,128(1)\n\t"                                       \
2683*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
2684*635a8641SAndroid Build Coastguard Worker          "ld  3,80(11)\n\t"                                       \
2685*635a8641SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
2686*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
2687*635a8641SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
2688*635a8641SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
2689*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
2690*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
2691*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
2692*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
2693*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
2694*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
2695*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
2696*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
2697*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
2698*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
2699*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
2700*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
2701*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
2702*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
2703*635a8641SAndroid Build Coastguard Worker          "addi 1,1,144"     /* restore frame */                   \
2704*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2705*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
2706*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2707*635a8641SAndroid Build Coastguard Worker       );                                                          \
2708*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2709*635a8641SAndroid Build Coastguard Worker    } while (0)
2710*635a8641SAndroid Build Coastguard Worker 
2711*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_ppc64_linux */
2712*635a8641SAndroid Build Coastguard Worker 
2713*635a8641SAndroid Build Coastguard Worker /* ------------------------- arm-linux ------------------------- */
2714*635a8641SAndroid Build Coastguard Worker 
2715*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_arm_linux)
2716*635a8641SAndroid Build Coastguard Worker 
2717*635a8641SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
2718*635a8641SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14"
2719*635a8641SAndroid Build Coastguard Worker 
2720*635a8641SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned
2721*635a8641SAndroid Build Coastguard Worker    long) == 4. */
2722*635a8641SAndroid Build Coastguard Worker 
2723*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
2724*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2725*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2726*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[1];                          \
2727*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2728*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2729*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2730*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2731*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2732*635a8641SAndroid Build Coastguard Worker          "mov %0, r0\n"                                           \
2733*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2734*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2735*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2736*635a8641SAndroid Build Coastguard Worker       );                                                          \
2737*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2738*635a8641SAndroid Build Coastguard Worker    } while (0)
2739*635a8641SAndroid Build Coastguard Worker 
2740*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
2741*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2742*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2743*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[2];                          \
2744*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2745*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2746*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
2747*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2748*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
2749*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2750*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2751*635a8641SAndroid Build Coastguard Worker          "mov %0, r0\n"                                           \
2752*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2753*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2754*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory",  __CALLER_SAVED_REGS         \
2755*635a8641SAndroid Build Coastguard Worker       );                                                          \
2756*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2757*635a8641SAndroid Build Coastguard Worker    } while (0)
2758*635a8641SAndroid Build Coastguard Worker 
2759*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
2760*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2761*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2762*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3];                          \
2763*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2764*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2765*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
2766*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
2767*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2768*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
2769*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
2770*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2771*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2772*635a8641SAndroid Build Coastguard Worker          "mov %0, r0\n"                                           \
2773*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2774*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2775*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2776*635a8641SAndroid Build Coastguard Worker       );                                                          \
2777*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2778*635a8641SAndroid Build Coastguard Worker    } while (0)
2779*635a8641SAndroid Build Coastguard Worker 
2780*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
2781*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2782*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2783*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[4];                          \
2784*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2785*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2786*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
2787*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
2788*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
2789*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2790*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
2791*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
2792*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
2793*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2794*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2795*635a8641SAndroid Build Coastguard Worker          "mov %0, r0\n"                                           \
2796*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2797*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2798*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2799*635a8641SAndroid Build Coastguard Worker       );                                                          \
2800*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2801*635a8641SAndroid Build Coastguard Worker    } while (0)
2802*635a8641SAndroid Build Coastguard Worker 
2803*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
2804*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2805*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2806*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[5];                          \
2807*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2808*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2809*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
2810*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
2811*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
2812*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
2813*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2814*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
2815*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
2816*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
2817*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
2818*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2819*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2820*635a8641SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
2821*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2822*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2823*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2824*635a8641SAndroid Build Coastguard Worker       );                                                          \
2825*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2826*635a8641SAndroid Build Coastguard Worker    } while (0)
2827*635a8641SAndroid Build Coastguard Worker 
2828*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
2829*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2830*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2831*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[6];                          \
2832*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2833*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2834*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
2835*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
2836*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
2837*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
2838*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
2839*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2840*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
2841*635a8641SAndroid Build Coastguard Worker          "push {r0} \n\t"                                         \
2842*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
2843*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
2844*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
2845*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
2846*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2847*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2848*635a8641SAndroid Build Coastguard Worker          "add sp, sp, #4 \n\t"                                    \
2849*635a8641SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
2850*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2851*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2852*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2853*635a8641SAndroid Build Coastguard Worker       );                                                          \
2854*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2855*635a8641SAndroid Build Coastguard Worker    } while (0)
2856*635a8641SAndroid Build Coastguard Worker 
2857*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
2858*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2859*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2860*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[7];                          \
2861*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2862*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2863*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
2864*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
2865*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
2866*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
2867*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
2868*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
2869*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2870*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
2871*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
2872*635a8641SAndroid Build Coastguard Worker          "push {r0, r1} \n\t"                                     \
2873*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
2874*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
2875*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
2876*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
2877*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2878*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2879*635a8641SAndroid Build Coastguard Worker          "add sp, sp, #8 \n\t"                                    \
2880*635a8641SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
2881*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2882*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2883*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2884*635a8641SAndroid Build Coastguard Worker       );                                                          \
2885*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2886*635a8641SAndroid Build Coastguard Worker    } while (0)
2887*635a8641SAndroid Build Coastguard Worker 
2888*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2889*635a8641SAndroid Build Coastguard Worker                                  arg7)                            \
2890*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2891*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2892*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[8];                          \
2893*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2894*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2895*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
2896*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
2897*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
2898*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
2899*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
2900*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
2901*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
2902*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2903*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
2904*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
2905*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
2906*635a8641SAndroid Build Coastguard Worker          "push {r0, r1, r2} \n\t"                                 \
2907*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
2908*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
2909*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
2910*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
2911*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2912*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2913*635a8641SAndroid Build Coastguard Worker          "add sp, sp, #12 \n\t"                                   \
2914*635a8641SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
2915*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2916*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2917*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2918*635a8641SAndroid Build Coastguard Worker       );                                                          \
2919*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2920*635a8641SAndroid Build Coastguard Worker    } while (0)
2921*635a8641SAndroid Build Coastguard Worker 
2922*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2923*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
2924*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2925*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2926*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[9];                          \
2927*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2928*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2929*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
2930*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
2931*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
2932*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
2933*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
2934*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
2935*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
2936*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
2937*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2938*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
2939*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
2940*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
2941*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
2942*635a8641SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3} \n\t"                             \
2943*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
2944*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
2945*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
2946*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
2947*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2948*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2949*635a8641SAndroid Build Coastguard Worker          "add sp, sp, #16 \n\t"                                   \
2950*635a8641SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
2951*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2952*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2953*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2954*635a8641SAndroid Build Coastguard Worker       );                                                          \
2955*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2956*635a8641SAndroid Build Coastguard Worker    } while (0)
2957*635a8641SAndroid Build Coastguard Worker 
2958*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
2959*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
2960*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2961*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
2962*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[10];                         \
2963*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
2964*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
2965*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
2966*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
2967*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
2968*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
2969*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
2970*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
2971*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
2972*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
2973*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
2974*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
2975*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
2976*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
2977*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
2978*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
2979*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1, #36] \n\t"                                 \
2980*635a8641SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3, r4} \n\t"                         \
2981*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
2982*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
2983*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
2984*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
2985*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
2986*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
2987*635a8641SAndroid Build Coastguard Worker          "add sp, sp, #20 \n\t"                                   \
2988*635a8641SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
2989*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
2990*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
2991*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
2992*635a8641SAndroid Build Coastguard Worker       );                                                          \
2993*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
2994*635a8641SAndroid Build Coastguard Worker    } while (0)
2995*635a8641SAndroid Build Coastguard Worker 
2996*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
2997*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
2998*635a8641SAndroid Build Coastguard Worker    do {                                                           \
2999*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3000*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[11];                         \
3001*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3002*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
3003*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
3004*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
3005*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
3006*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
3007*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
3008*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
3009*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
3010*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
3011*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
3012*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
3013*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3014*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #40] \n\t"                                 \
3015*635a8641SAndroid Build Coastguard Worker          "push {r0} \n\t"                                         \
3016*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
3017*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
3018*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
3019*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
3020*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1, #36] \n\t"                                 \
3021*635a8641SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3, r4} \n\t"                         \
3022*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
3023*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
3024*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
3025*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
3026*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
3027*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
3028*635a8641SAndroid Build Coastguard Worker          "add sp, sp, #24 \n\t"                                   \
3029*635a8641SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
3030*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3031*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
3032*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3033*635a8641SAndroid Build Coastguard Worker       );                                                          \
3034*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3035*635a8641SAndroid Build Coastguard Worker    } while (0)
3036*635a8641SAndroid Build Coastguard Worker 
3037*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
3038*635a8641SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
3039*635a8641SAndroid Build Coastguard Worker                                   arg11)                          \
3040*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3041*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3042*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[12];                         \
3043*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3044*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
3045*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
3046*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
3047*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
3048*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
3049*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
3050*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
3051*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
3052*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
3053*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
3054*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
3055*635a8641SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
3056*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3057*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #40] \n\t"                                 \
3058*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #44] \n\t"                                 \
3059*635a8641SAndroid Build Coastguard Worker          "push {r0, r1} \n\t"                                     \
3060*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
3061*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
3062*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
3063*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
3064*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1, #36] \n\t"                                 \
3065*635a8641SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3, r4} \n\t"                         \
3066*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
3067*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
3068*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
3069*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
3070*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
3071*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
3072*635a8641SAndroid Build Coastguard Worker          "add sp, sp, #28 \n\t"                                   \
3073*635a8641SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
3074*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3075*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
3076*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory",__CALLER_SAVED_REGS           \
3077*635a8641SAndroid Build Coastguard Worker       );                                                          \
3078*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3079*635a8641SAndroid Build Coastguard Worker    } while (0)
3080*635a8641SAndroid Build Coastguard Worker 
3081*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,       \
3082*635a8641SAndroid Build Coastguard Worker                                   arg6,arg7,arg8,arg9,arg10,      \
3083*635a8641SAndroid Build Coastguard Worker                                   arg11,arg12)                    \
3084*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3085*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3086*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[13];                         \
3087*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3088*635a8641SAndroid Build Coastguard Worker       _argvec[0] = (unsigned long)_orig.nraddr;                   \
3089*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)(arg1);                         \
3090*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)(arg2);                         \
3091*635a8641SAndroid Build Coastguard Worker       _argvec[3] = (unsigned long)(arg3);                         \
3092*635a8641SAndroid Build Coastguard Worker       _argvec[4] = (unsigned long)(arg4);                         \
3093*635a8641SAndroid Build Coastguard Worker       _argvec[5] = (unsigned long)(arg5);                         \
3094*635a8641SAndroid Build Coastguard Worker       _argvec[6] = (unsigned long)(arg6);                         \
3095*635a8641SAndroid Build Coastguard Worker       _argvec[7] = (unsigned long)(arg7);                         \
3096*635a8641SAndroid Build Coastguard Worker       _argvec[8] = (unsigned long)(arg8);                         \
3097*635a8641SAndroid Build Coastguard Worker       _argvec[9] = (unsigned long)(arg9);                         \
3098*635a8641SAndroid Build Coastguard Worker       _argvec[10] = (unsigned long)(arg10);                       \
3099*635a8641SAndroid Build Coastguard Worker       _argvec[11] = (unsigned long)(arg11);                       \
3100*635a8641SAndroid Build Coastguard Worker       _argvec[12] = (unsigned long)(arg12);                       \
3101*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3102*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #40] \n\t"                                 \
3103*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #44] \n\t"                                 \
3104*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #48] \n\t"                                 \
3105*635a8641SAndroid Build Coastguard Worker          "push {r0, r1, r2} \n\t"                                 \
3106*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #20] \n\t"                                 \
3107*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #24] \n\t"                                 \
3108*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #28] \n\t"                                 \
3109*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #32] \n\t"                                 \
3110*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1, #36] \n\t"                                 \
3111*635a8641SAndroid Build Coastguard Worker          "push {r0, r1, r2, r3, r4} \n\t"                         \
3112*635a8641SAndroid Build Coastguard Worker          "ldr r0, [%1, #4] \n\t"                                  \
3113*635a8641SAndroid Build Coastguard Worker          "ldr r1, [%1, #8] \n\t"                                  \
3114*635a8641SAndroid Build Coastguard Worker          "ldr r2, [%1, #12] \n\t"                                 \
3115*635a8641SAndroid Build Coastguard Worker          "ldr r3, [%1, #16] \n\t"                                 \
3116*635a8641SAndroid Build Coastguard Worker          "ldr r4, [%1] \n\t"  /* target->r4 */                    \
3117*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4                   \
3118*635a8641SAndroid Build Coastguard Worker          "add sp, sp, #32 \n\t"                                   \
3119*635a8641SAndroid Build Coastguard Worker          "mov %0, r0"                                             \
3120*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3121*635a8641SAndroid Build Coastguard Worker          : /*in*/    "0" (&_argvec[0])                            \
3122*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3123*635a8641SAndroid Build Coastguard Worker       );                                                          \
3124*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3125*635a8641SAndroid Build Coastguard Worker    } while (0)
3126*635a8641SAndroid Build Coastguard Worker 
3127*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_arm_linux */
3128*635a8641SAndroid Build Coastguard Worker 
3129*635a8641SAndroid Build Coastguard Worker /* ------------------------ ppc32-aix5 ------------------------- */
3130*635a8641SAndroid Build Coastguard Worker 
3131*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_ppc32_aix5)
3132*635a8641SAndroid Build Coastguard Worker 
3133*635a8641SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
3134*635a8641SAndroid Build Coastguard Worker 
3135*635a8641SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
3136*635a8641SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS                                       \
3137*635a8641SAndroid Build Coastguard Worker    "lr", "ctr", "xer",                                            \
3138*635a8641SAndroid Build Coastguard Worker    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
3139*635a8641SAndroid Build Coastguard Worker    "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
3140*635a8641SAndroid Build Coastguard Worker    "r11", "r12", "r13"
3141*635a8641SAndroid Build Coastguard Worker 
3142*635a8641SAndroid Build Coastguard Worker /* Expand the stack frame, copying enough info that unwinding
3143*635a8641SAndroid Build Coastguard Worker    still works.  Trashes r3. */
3144*635a8641SAndroid Build Coastguard Worker 
3145*635a8641SAndroid Build Coastguard Worker #define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr)                      \
3146*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-" #_n_fr "\n\t"                               \
3147*635a8641SAndroid Build Coastguard Worker          "lwz  3," #_n_fr "(1)\n\t"                               \
3148*635a8641SAndroid Build Coastguard Worker          "stw  3,0(1)\n\t"
3149*635a8641SAndroid Build Coastguard Worker 
3150*635a8641SAndroid Build Coastguard Worker #define VG_CONTRACT_FRAME_BY(_n_fr)                               \
3151*635a8641SAndroid Build Coastguard Worker          "addi 1,1," #_n_fr "\n\t"
3152*635a8641SAndroid Build Coastguard Worker 
3153*635a8641SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc32-aix5, sizeof(unsigned
3154*635a8641SAndroid Build Coastguard Worker    long) == 4. */
3155*635a8641SAndroid Build Coastguard Worker 
3156*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
3157*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3158*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3159*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+0];                        \
3160*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3161*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3162*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)_orig.r2;                       \
3163*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)_orig.nraddr;                   \
3164*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3165*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3166*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3167*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3168*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3169*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3170*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3171*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3172*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3173*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3174*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3175*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3176*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3177*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3178*635a8641SAndroid Build Coastguard Worker       );                                                          \
3179*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3180*635a8641SAndroid Build Coastguard Worker    } while (0)
3181*635a8641SAndroid Build Coastguard Worker 
3182*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
3183*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3184*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3185*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+1];                        \
3186*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3187*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3188*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3189*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3190*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3191*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3192*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3193*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3194*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3195*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3196*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3197*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3198*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3199*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3200*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3201*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3202*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3203*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3204*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3205*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3206*635a8641SAndroid Build Coastguard Worker       );                                                          \
3207*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3208*635a8641SAndroid Build Coastguard Worker    } while (0)
3209*635a8641SAndroid Build Coastguard Worker 
3210*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
3211*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3212*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3213*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+2];                        \
3214*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3215*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3216*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3217*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3218*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3219*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3220*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3221*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3222*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3223*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3224*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3225*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3226*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3227*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3228*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3229*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3230*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3231*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3232*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3233*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3234*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3235*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3236*635a8641SAndroid Build Coastguard Worker       );                                                          \
3237*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3238*635a8641SAndroid Build Coastguard Worker    } while (0)
3239*635a8641SAndroid Build Coastguard Worker 
3240*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
3241*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3242*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3243*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+3];                        \
3244*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3245*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3246*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3247*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3248*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3249*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3250*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3251*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3252*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3253*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3254*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3255*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3256*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3257*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3258*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3259*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3260*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3261*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3262*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3263*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3264*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3265*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3266*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3267*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3268*635a8641SAndroid Build Coastguard Worker       );                                                          \
3269*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3270*635a8641SAndroid Build Coastguard Worker    } while (0)
3271*635a8641SAndroid Build Coastguard Worker 
3272*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
3273*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3274*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3275*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+4];                        \
3276*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3277*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3278*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3279*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3280*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3281*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3282*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3283*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3284*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3285*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3286*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3287*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3288*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3289*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3290*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3291*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3292*635a8641SAndroid Build Coastguard Worker          "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
3293*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3294*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3295*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3296*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3297*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3298*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3299*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3300*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3301*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3302*635a8641SAndroid Build Coastguard Worker       );                                                          \
3303*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3304*635a8641SAndroid Build Coastguard Worker    } while (0)
3305*635a8641SAndroid Build Coastguard Worker 
3306*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
3307*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3308*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3309*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+5];                        \
3310*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3311*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3312*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3313*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3314*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3315*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3316*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3317*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3318*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3319*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3320*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3321*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3322*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3323*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3324*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3325*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t" /* arg2->r4 */                       \
3326*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3327*635a8641SAndroid Build Coastguard Worker          "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
3328*635a8641SAndroid Build Coastguard Worker          "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
3329*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3330*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3331*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3332*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3333*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3334*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3335*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3336*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3337*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3338*635a8641SAndroid Build Coastguard Worker       );                                                          \
3339*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3340*635a8641SAndroid Build Coastguard Worker    } while (0)
3341*635a8641SAndroid Build Coastguard Worker 
3342*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
3343*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3344*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3345*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+6];                        \
3346*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3347*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3348*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3349*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3350*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3351*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3352*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3353*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3354*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3355*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3356*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3357*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3358*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3359*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3360*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3361*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3362*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3363*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3364*635a8641SAndroid Build Coastguard Worker          "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
3365*635a8641SAndroid Build Coastguard Worker          "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
3366*635a8641SAndroid Build Coastguard Worker          "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
3367*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3368*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3369*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3370*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3371*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3372*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3373*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3374*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3375*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3376*635a8641SAndroid Build Coastguard Worker       );                                                          \
3377*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3378*635a8641SAndroid Build Coastguard Worker    } while (0)
3379*635a8641SAndroid Build Coastguard Worker 
3380*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
3381*635a8641SAndroid Build Coastguard Worker                                  arg7)                            \
3382*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3383*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3384*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+7];                        \
3385*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3386*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3387*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3388*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3389*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3390*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3391*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3392*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3393*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3394*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3395*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3396*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3397*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3398*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3399*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3400*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3401*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3402*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3403*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3404*635a8641SAndroid Build Coastguard Worker          "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
3405*635a8641SAndroid Build Coastguard Worker          "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
3406*635a8641SAndroid Build Coastguard Worker          "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
3407*635a8641SAndroid Build Coastguard Worker          "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
3408*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3409*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3410*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3411*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3412*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3413*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3414*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3415*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3416*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3417*635a8641SAndroid Build Coastguard Worker       );                                                          \
3418*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3419*635a8641SAndroid Build Coastguard Worker    } while (0)
3420*635a8641SAndroid Build Coastguard Worker 
3421*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
3422*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
3423*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3424*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3425*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+8];                        \
3426*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3427*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3428*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3429*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3430*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3431*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3432*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3433*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3434*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3435*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3436*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3437*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3438*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3439*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3440*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3441*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3442*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3443*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3444*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3445*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3446*635a8641SAndroid Build Coastguard Worker          "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
3447*635a8641SAndroid Build Coastguard Worker          "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
3448*635a8641SAndroid Build Coastguard Worker          "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
3449*635a8641SAndroid Build Coastguard Worker          "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
3450*635a8641SAndroid Build Coastguard Worker          "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
3451*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3452*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3453*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3454*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3455*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3456*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3457*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3458*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3459*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3460*635a8641SAndroid Build Coastguard Worker       );                                                          \
3461*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3462*635a8641SAndroid Build Coastguard Worker    } while (0)
3463*635a8641SAndroid Build Coastguard Worker 
3464*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
3465*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
3466*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3467*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3468*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+9];                        \
3469*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3470*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3471*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3472*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3473*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3474*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3475*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3476*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3477*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3478*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3479*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3480*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3481*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3482*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3483*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3484*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3485*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3486*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3487*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(64)                        \
3488*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
3489*635a8641SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
3490*635a8641SAndroid Build Coastguard Worker          "stw 3,56(1)\n\t"                                        \
3491*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3492*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3493*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3494*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3495*635a8641SAndroid Build Coastguard Worker          "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
3496*635a8641SAndroid Build Coastguard Worker          "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
3497*635a8641SAndroid Build Coastguard Worker          "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
3498*635a8641SAndroid Build Coastguard Worker          "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
3499*635a8641SAndroid Build Coastguard Worker          "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
3500*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3501*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3502*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3503*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3504*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3505*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(64)                                 \
3506*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3507*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3508*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3509*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3510*635a8641SAndroid Build Coastguard Worker       );                                                          \
3511*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3512*635a8641SAndroid Build Coastguard Worker    } while (0)
3513*635a8641SAndroid Build Coastguard Worker 
3514*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
3515*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
3516*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3517*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3518*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+10];                       \
3519*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3520*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3521*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3522*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3523*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3524*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3525*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3526*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3527*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3528*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3529*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3530*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3531*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3532*635a8641SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
3533*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3534*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3535*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3536*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3537*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3538*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(64)                        \
3539*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
3540*635a8641SAndroid Build Coastguard Worker          "lwz 3,40(11)\n\t"                                       \
3541*635a8641SAndroid Build Coastguard Worker          "stw 3,60(1)\n\t"                                        \
3542*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
3543*635a8641SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
3544*635a8641SAndroid Build Coastguard Worker          "stw 3,56(1)\n\t"                                        \
3545*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3546*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3547*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3548*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3549*635a8641SAndroid Build Coastguard Worker          "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
3550*635a8641SAndroid Build Coastguard Worker          "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
3551*635a8641SAndroid Build Coastguard Worker          "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
3552*635a8641SAndroid Build Coastguard Worker          "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
3553*635a8641SAndroid Build Coastguard Worker          "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
3554*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3555*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3556*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3557*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3558*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3559*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(64)                                 \
3560*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3561*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3562*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3563*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3564*635a8641SAndroid Build Coastguard Worker       );                                                          \
3565*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3566*635a8641SAndroid Build Coastguard Worker    } while (0)
3567*635a8641SAndroid Build Coastguard Worker 
3568*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
3569*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)     \
3570*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3571*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3572*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+11];                       \
3573*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3574*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3575*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3576*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3577*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3578*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3579*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3580*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3581*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3582*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3583*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3584*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3585*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3586*635a8641SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
3587*635a8641SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
3588*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3589*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3590*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3591*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3592*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3593*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(72)                        \
3594*635a8641SAndroid Build Coastguard Worker          /* arg11 */                                              \
3595*635a8641SAndroid Build Coastguard Worker          "lwz 3,44(11)\n\t"                                       \
3596*635a8641SAndroid Build Coastguard Worker          "stw 3,64(1)\n\t"                                        \
3597*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
3598*635a8641SAndroid Build Coastguard Worker          "lwz 3,40(11)\n\t"                                       \
3599*635a8641SAndroid Build Coastguard Worker          "stw 3,60(1)\n\t"                                        \
3600*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
3601*635a8641SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
3602*635a8641SAndroid Build Coastguard Worker          "stw 3,56(1)\n\t"                                        \
3603*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3604*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3605*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3606*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3607*635a8641SAndroid Build Coastguard Worker          "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
3608*635a8641SAndroid Build Coastguard Worker          "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
3609*635a8641SAndroid Build Coastguard Worker          "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
3610*635a8641SAndroid Build Coastguard Worker          "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
3611*635a8641SAndroid Build Coastguard Worker          "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
3612*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3613*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3614*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3615*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3616*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3617*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(72)                                 \
3618*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3619*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3620*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3621*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3622*635a8641SAndroid Build Coastguard Worker       );                                                          \
3623*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3624*635a8641SAndroid Build Coastguard Worker    } while (0)
3625*635a8641SAndroid Build Coastguard Worker 
3626*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
3627*635a8641SAndroid Build Coastguard Worker                                 arg7,arg8,arg9,arg10,arg11,arg12) \
3628*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3629*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3630*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+12];                       \
3631*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3632*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3633*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3634*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3635*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3636*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3637*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3638*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3639*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3640*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3641*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3642*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3643*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
3644*635a8641SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
3645*635a8641SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
3646*635a8641SAndroid Build Coastguard Worker       _argvec[2+12] = (unsigned long)arg12;                       \
3647*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3648*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3649*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3650*635a8641SAndroid Build Coastguard Worker          "stw  2,-8(11)\n\t"  /* save tocptr */                   \
3651*635a8641SAndroid Build Coastguard Worker          "lwz  2,-4(11)\n\t"  /* use nraddr's tocptr */           \
3652*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(72)                        \
3653*635a8641SAndroid Build Coastguard Worker          /* arg12 */                                              \
3654*635a8641SAndroid Build Coastguard Worker          "lwz 3,48(11)\n\t"                                       \
3655*635a8641SAndroid Build Coastguard Worker          "stw 3,68(1)\n\t"                                        \
3656*635a8641SAndroid Build Coastguard Worker          /* arg11 */                                              \
3657*635a8641SAndroid Build Coastguard Worker          "lwz 3,44(11)\n\t"                                       \
3658*635a8641SAndroid Build Coastguard Worker          "stw 3,64(1)\n\t"                                        \
3659*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
3660*635a8641SAndroid Build Coastguard Worker          "lwz 3,40(11)\n\t"                                       \
3661*635a8641SAndroid Build Coastguard Worker          "stw 3,60(1)\n\t"                                        \
3662*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
3663*635a8641SAndroid Build Coastguard Worker          "lwz 3,36(11)\n\t"                                       \
3664*635a8641SAndroid Build Coastguard Worker          "stw 3,56(1)\n\t"                                        \
3665*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
3666*635a8641SAndroid Build Coastguard Worker          "lwz  3, 4(11)\n\t"  /* arg1->r3 */                      \
3667*635a8641SAndroid Build Coastguard Worker          "lwz  4, 8(11)\n\t"  /* arg2->r4 */                      \
3668*635a8641SAndroid Build Coastguard Worker          "lwz  5, 12(11)\n\t" /* arg3->r5 */                      \
3669*635a8641SAndroid Build Coastguard Worker          "lwz  6, 16(11)\n\t" /* arg4->r6 */                      \
3670*635a8641SAndroid Build Coastguard Worker          "lwz  7, 20(11)\n\t" /* arg5->r7 */                      \
3671*635a8641SAndroid Build Coastguard Worker          "lwz  8, 24(11)\n\t" /* arg6->r8 */                      \
3672*635a8641SAndroid Build Coastguard Worker          "lwz  9, 28(11)\n\t" /* arg7->r9 */                      \
3673*635a8641SAndroid Build Coastguard Worker          "lwz 10, 32(11)\n\t" /* arg8->r10 */                     \
3674*635a8641SAndroid Build Coastguard Worker          "lwz 11, 0(11)\n\t"  /* target->r11 */                   \
3675*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3676*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3677*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3678*635a8641SAndroid Build Coastguard Worker          "lwz 2,-8(11)\n\t" /* restore tocptr */                  \
3679*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(72)                                 \
3680*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3681*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3682*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3683*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3684*635a8641SAndroid Build Coastguard Worker       );                                                          \
3685*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3686*635a8641SAndroid Build Coastguard Worker    } while (0)
3687*635a8641SAndroid Build Coastguard Worker 
3688*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_ppc32_aix5 */
3689*635a8641SAndroid Build Coastguard Worker 
3690*635a8641SAndroid Build Coastguard Worker /* ------------------------ ppc64-aix5 ------------------------- */
3691*635a8641SAndroid Build Coastguard Worker 
3692*635a8641SAndroid Build Coastguard Worker #if defined(PLAT_ppc64_aix5)
3693*635a8641SAndroid Build Coastguard Worker 
3694*635a8641SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
3695*635a8641SAndroid Build Coastguard Worker 
3696*635a8641SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
3697*635a8641SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS                                       \
3698*635a8641SAndroid Build Coastguard Worker    "lr", "ctr", "xer",                                            \
3699*635a8641SAndroid Build Coastguard Worker    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",        \
3700*635a8641SAndroid Build Coastguard Worker    "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",   \
3701*635a8641SAndroid Build Coastguard Worker    "r11", "r12", "r13"
3702*635a8641SAndroid Build Coastguard Worker 
3703*635a8641SAndroid Build Coastguard Worker /* Expand the stack frame, copying enough info that unwinding
3704*635a8641SAndroid Build Coastguard Worker    still works.  Trashes r3. */
3705*635a8641SAndroid Build Coastguard Worker 
3706*635a8641SAndroid Build Coastguard Worker #define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr)                      \
3707*635a8641SAndroid Build Coastguard Worker          "addi 1,1,-" #_n_fr "\n\t"                               \
3708*635a8641SAndroid Build Coastguard Worker          "ld   3," #_n_fr "(1)\n\t"                               \
3709*635a8641SAndroid Build Coastguard Worker          "std  3,0(1)\n\t"
3710*635a8641SAndroid Build Coastguard Worker 
3711*635a8641SAndroid Build Coastguard Worker #define VG_CONTRACT_FRAME_BY(_n_fr)                               \
3712*635a8641SAndroid Build Coastguard Worker          "addi 1,1," #_n_fr "\n\t"
3713*635a8641SAndroid Build Coastguard Worker 
3714*635a8641SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc64-aix5, sizeof(unsigned
3715*635a8641SAndroid Build Coastguard Worker    long) == 8. */
3716*635a8641SAndroid Build Coastguard Worker 
3717*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig)                                   \
3718*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3719*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3720*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+0];                        \
3721*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3722*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3723*635a8641SAndroid Build Coastguard Worker       _argvec[1] = (unsigned long)_orig.r2;                       \
3724*635a8641SAndroid Build Coastguard Worker       _argvec[2] = (unsigned long)_orig.nraddr;                   \
3725*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3726*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3727*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3728*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
3729*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3730*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3731*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3732*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3733*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3734*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
3735*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3736*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3737*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3738*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3739*635a8641SAndroid Build Coastguard Worker       );                                                          \
3740*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3741*635a8641SAndroid Build Coastguard Worker    } while (0)
3742*635a8641SAndroid Build Coastguard Worker 
3743*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1)                             \
3744*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3745*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3746*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+1];                        \
3747*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3748*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3749*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3750*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3751*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3752*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3753*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3754*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3755*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
3756*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3757*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3758*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3759*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3760*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3761*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3762*635a8641SAndroid Build Coastguard Worker          "ld 2,-16(11)\n\t" /* restore tocptr */                  \
3763*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3764*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3765*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3766*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3767*635a8641SAndroid Build Coastguard Worker       );                                                          \
3768*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3769*635a8641SAndroid Build Coastguard Worker    } while (0)
3770*635a8641SAndroid Build Coastguard Worker 
3771*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
3772*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3773*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3774*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+2];                        \
3775*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3776*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3777*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3778*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3779*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3780*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3781*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3782*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3783*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3784*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
3785*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3786*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3787*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3788*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3789*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3790*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3791*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3792*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
3793*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3794*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3795*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3796*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3797*635a8641SAndroid Build Coastguard Worker       );                                                          \
3798*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3799*635a8641SAndroid Build Coastguard Worker    } while (0)
3800*635a8641SAndroid Build Coastguard Worker 
3801*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3)                 \
3802*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3803*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3804*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+3];                        \
3805*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3806*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3807*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3808*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3809*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3810*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3811*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3812*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3813*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3814*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3815*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
3816*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3817*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3818*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3819*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3820*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3821*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3822*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3823*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3824*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
3825*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3826*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3827*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3828*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3829*635a8641SAndroid Build Coastguard Worker       );                                                          \
3830*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3831*635a8641SAndroid Build Coastguard Worker    } while (0)
3832*635a8641SAndroid Build Coastguard Worker 
3833*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4)           \
3834*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3835*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3836*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+4];                        \
3837*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3838*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3839*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3840*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3841*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3842*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3843*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3844*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3845*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3846*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3847*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3848*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
3849*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3850*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3851*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3852*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3853*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
3854*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3855*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3856*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3857*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3858*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
3859*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3860*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3861*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3862*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3863*635a8641SAndroid Build Coastguard Worker       );                                                          \
3864*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3865*635a8641SAndroid Build Coastguard Worker    } while (0)
3866*635a8641SAndroid Build Coastguard Worker 
3867*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5)        \
3868*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3869*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3870*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+5];                        \
3871*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3872*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3873*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3874*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3875*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3876*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3877*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3878*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3879*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3880*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3881*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3882*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3883*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
3884*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3885*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3886*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3887*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3888*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
3889*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
3890*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3891*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3892*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3893*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3894*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
3895*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3896*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3897*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3898*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3899*635a8641SAndroid Build Coastguard Worker       );                                                          \
3900*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3901*635a8641SAndroid Build Coastguard Worker    } while (0)
3902*635a8641SAndroid Build Coastguard Worker 
3903*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6)   \
3904*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3905*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3906*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+6];                        \
3907*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3908*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3909*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3910*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3911*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3912*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3913*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3914*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3915*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3916*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3917*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3918*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3919*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3920*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
3921*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3922*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3923*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3924*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3925*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
3926*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
3927*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
3928*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3929*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3930*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3931*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3932*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
3933*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3934*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3935*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3936*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3937*635a8641SAndroid Build Coastguard Worker       );                                                          \
3938*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3939*635a8641SAndroid Build Coastguard Worker    } while (0)
3940*635a8641SAndroid Build Coastguard Worker 
3941*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
3942*635a8641SAndroid Build Coastguard Worker                                  arg7)                            \
3943*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3944*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3945*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+7];                        \
3946*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3947*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3948*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3949*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3950*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3951*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3952*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3953*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3954*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3955*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3956*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3957*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
3958*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3959*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
3960*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
3961*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
3962*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
3963*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
3964*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
3965*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
3966*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
3967*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
3968*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
3969*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
3970*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
3971*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
3972*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
3973*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
3974*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
3975*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
3976*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
3977*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
3978*635a8641SAndroid Build Coastguard Worker       );                                                          \
3979*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
3980*635a8641SAndroid Build Coastguard Worker    } while (0)
3981*635a8641SAndroid Build Coastguard Worker 
3982*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
3983*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8)                       \
3984*635a8641SAndroid Build Coastguard Worker    do {                                                           \
3985*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
3986*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+8];                        \
3987*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
3988*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
3989*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
3990*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
3991*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
3992*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
3993*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
3994*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
3995*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
3996*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
3997*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
3998*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
3999*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4000*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4001*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
4002*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
4003*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
4004*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
4005*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
4006*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
4007*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
4008*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
4009*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
4010*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
4011*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
4012*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
4013*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
4014*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4015*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
4016*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
4017*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
4018*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4019*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
4020*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
4021*635a8641SAndroid Build Coastguard Worker       );                                                          \
4022*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4023*635a8641SAndroid Build Coastguard Worker    } while (0)
4024*635a8641SAndroid Build Coastguard Worker 
4025*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,   \
4026*635a8641SAndroid Build Coastguard Worker                                  arg7,arg8,arg9)                  \
4027*635a8641SAndroid Build Coastguard Worker    do {                                                           \
4028*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4029*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+9];                        \
4030*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4031*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
4032*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
4033*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
4034*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
4035*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
4036*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
4037*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
4038*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
4039*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
4040*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
4041*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
4042*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
4043*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4044*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4045*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
4046*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
4047*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
4048*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(128)                       \
4049*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
4050*635a8641SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
4051*635a8641SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
4052*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
4053*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
4054*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
4055*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
4056*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
4057*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
4058*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
4059*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
4060*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
4061*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
4062*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
4063*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4064*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
4065*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
4066*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(128)                                \
4067*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
4068*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4069*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
4070*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
4071*635a8641SAndroid Build Coastguard Worker       );                                                          \
4072*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4073*635a8641SAndroid Build Coastguard Worker    } while (0)
4074*635a8641SAndroid Build Coastguard Worker 
4075*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
4076*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10)           \
4077*635a8641SAndroid Build Coastguard Worker    do {                                                           \
4078*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4079*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+10];                       \
4080*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4081*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
4082*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
4083*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
4084*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
4085*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
4086*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
4087*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
4088*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
4089*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
4090*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
4091*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
4092*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
4093*635a8641SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
4094*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4095*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4096*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
4097*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
4098*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
4099*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(128)                       \
4100*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
4101*635a8641SAndroid Build Coastguard Worker          "ld  3,80(11)\n\t"                                       \
4102*635a8641SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
4103*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
4104*635a8641SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
4105*635a8641SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
4106*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
4107*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
4108*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
4109*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
4110*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
4111*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
4112*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
4113*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
4114*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
4115*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
4116*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
4117*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4118*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
4119*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
4120*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(128)                                \
4121*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
4122*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4123*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
4124*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
4125*635a8641SAndroid Build Coastguard Worker       );                                                          \
4126*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4127*635a8641SAndroid Build Coastguard Worker    } while (0)
4128*635a8641SAndroid Build Coastguard Worker 
4129*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
4130*635a8641SAndroid Build Coastguard Worker                                   arg7,arg8,arg9,arg10,arg11)     \
4131*635a8641SAndroid Build Coastguard Worker    do {                                                           \
4132*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4133*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+11];                       \
4134*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4135*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
4136*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
4137*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
4138*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
4139*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
4140*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
4141*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
4142*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
4143*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
4144*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
4145*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
4146*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
4147*635a8641SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
4148*635a8641SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
4149*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4150*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4151*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
4152*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
4153*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
4154*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(144)                       \
4155*635a8641SAndroid Build Coastguard Worker          /* arg11 */                                              \
4156*635a8641SAndroid Build Coastguard Worker          "ld  3,88(11)\n\t"                                       \
4157*635a8641SAndroid Build Coastguard Worker          "std 3,128(1)\n\t"                                       \
4158*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
4159*635a8641SAndroid Build Coastguard Worker          "ld  3,80(11)\n\t"                                       \
4160*635a8641SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
4161*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
4162*635a8641SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
4163*635a8641SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
4164*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
4165*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
4166*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
4167*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
4168*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
4169*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
4170*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
4171*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
4172*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
4173*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
4174*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
4175*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4176*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
4177*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
4178*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(144)                                \
4179*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
4180*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4181*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
4182*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
4183*635a8641SAndroid Build Coastguard Worker       );                                                          \
4184*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4185*635a8641SAndroid Build Coastguard Worker    } while (0)
4186*635a8641SAndroid Build Coastguard Worker 
4187*635a8641SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6,  \
4188*635a8641SAndroid Build Coastguard Worker                                 arg7,arg8,arg9,arg10,arg11,arg12) \
4189*635a8641SAndroid Build Coastguard Worker    do {                                                           \
4190*635a8641SAndroid Build Coastguard Worker       volatile OrigFn        _orig = (orig);                      \
4191*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _argvec[3+12];                       \
4192*635a8641SAndroid Build Coastguard Worker       volatile unsigned long _res;                                \
4193*635a8641SAndroid Build Coastguard Worker       /* _argvec[0] holds current r2 across the call */           \
4194*635a8641SAndroid Build Coastguard Worker       _argvec[1]   = (unsigned long)_orig.r2;                     \
4195*635a8641SAndroid Build Coastguard Worker       _argvec[2]   = (unsigned long)_orig.nraddr;                 \
4196*635a8641SAndroid Build Coastguard Worker       _argvec[2+1] = (unsigned long)arg1;                         \
4197*635a8641SAndroid Build Coastguard Worker       _argvec[2+2] = (unsigned long)arg2;                         \
4198*635a8641SAndroid Build Coastguard Worker       _argvec[2+3] = (unsigned long)arg3;                         \
4199*635a8641SAndroid Build Coastguard Worker       _argvec[2+4] = (unsigned long)arg4;                         \
4200*635a8641SAndroid Build Coastguard Worker       _argvec[2+5] = (unsigned long)arg5;                         \
4201*635a8641SAndroid Build Coastguard Worker       _argvec[2+6] = (unsigned long)arg6;                         \
4202*635a8641SAndroid Build Coastguard Worker       _argvec[2+7] = (unsigned long)arg7;                         \
4203*635a8641SAndroid Build Coastguard Worker       _argvec[2+8] = (unsigned long)arg8;                         \
4204*635a8641SAndroid Build Coastguard Worker       _argvec[2+9] = (unsigned long)arg9;                         \
4205*635a8641SAndroid Build Coastguard Worker       _argvec[2+10] = (unsigned long)arg10;                       \
4206*635a8641SAndroid Build Coastguard Worker       _argvec[2+11] = (unsigned long)arg11;                       \
4207*635a8641SAndroid Build Coastguard Worker       _argvec[2+12] = (unsigned long)arg12;                       \
4208*635a8641SAndroid Build Coastguard Worker       __asm__ volatile(                                           \
4209*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4210*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(512)                       \
4211*635a8641SAndroid Build Coastguard Worker          "std  2,-16(11)\n\t" /* save tocptr */                   \
4212*635a8641SAndroid Build Coastguard Worker          "ld   2,-8(11)\n\t"  /* use nraddr's tocptr */           \
4213*635a8641SAndroid Build Coastguard Worker          VG_EXPAND_FRAME_BY_trashes_r3(144)                       \
4214*635a8641SAndroid Build Coastguard Worker          /* arg12 */                                              \
4215*635a8641SAndroid Build Coastguard Worker          "ld  3,96(11)\n\t"                                       \
4216*635a8641SAndroid Build Coastguard Worker          "std 3,136(1)\n\t"                                       \
4217*635a8641SAndroid Build Coastguard Worker          /* arg11 */                                              \
4218*635a8641SAndroid Build Coastguard Worker          "ld  3,88(11)\n\t"                                       \
4219*635a8641SAndroid Build Coastguard Worker          "std 3,128(1)\n\t"                                       \
4220*635a8641SAndroid Build Coastguard Worker          /* arg10 */                                              \
4221*635a8641SAndroid Build Coastguard Worker          "ld  3,80(11)\n\t"                                       \
4222*635a8641SAndroid Build Coastguard Worker          "std 3,120(1)\n\t"                                       \
4223*635a8641SAndroid Build Coastguard Worker          /* arg9 */                                               \
4224*635a8641SAndroid Build Coastguard Worker          "ld  3,72(11)\n\t"                                       \
4225*635a8641SAndroid Build Coastguard Worker          "std 3,112(1)\n\t"                                       \
4226*635a8641SAndroid Build Coastguard Worker          /* args1-8 */                                            \
4227*635a8641SAndroid Build Coastguard Worker          "ld   3, 8(11)\n\t"  /* arg1->r3 */                      \
4228*635a8641SAndroid Build Coastguard Worker          "ld   4, 16(11)\n\t" /* arg2->r4 */                      \
4229*635a8641SAndroid Build Coastguard Worker          "ld   5, 24(11)\n\t" /* arg3->r5 */                      \
4230*635a8641SAndroid Build Coastguard Worker          "ld   6, 32(11)\n\t" /* arg4->r6 */                      \
4231*635a8641SAndroid Build Coastguard Worker          "ld   7, 40(11)\n\t" /* arg5->r7 */                      \
4232*635a8641SAndroid Build Coastguard Worker          "ld   8, 48(11)\n\t" /* arg6->r8 */                      \
4233*635a8641SAndroid Build Coastguard Worker          "ld   9, 56(11)\n\t" /* arg7->r9 */                      \
4234*635a8641SAndroid Build Coastguard Worker          "ld  10, 64(11)\n\t" /* arg8->r10 */                     \
4235*635a8641SAndroid Build Coastguard Worker          "ld  11, 0(11)\n\t"  /* target->r11 */                   \
4236*635a8641SAndroid Build Coastguard Worker          VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11                  \
4237*635a8641SAndroid Build Coastguard Worker          "mr 11,%1\n\t"                                           \
4238*635a8641SAndroid Build Coastguard Worker          "mr %0,3\n\t"                                            \
4239*635a8641SAndroid Build Coastguard Worker          "ld  2,-16(11)\n\t" /* restore tocptr */                 \
4240*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(144)                                \
4241*635a8641SAndroid Build Coastguard Worker          VG_CONTRACT_FRAME_BY(512)                                \
4242*635a8641SAndroid Build Coastguard Worker          : /*out*/   "=r" (_res)                                  \
4243*635a8641SAndroid Build Coastguard Worker          : /*in*/    "r" (&_argvec[2])                            \
4244*635a8641SAndroid Build Coastguard Worker          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS          \
4245*635a8641SAndroid Build Coastguard Worker       );                                                          \
4246*635a8641SAndroid Build Coastguard Worker       lval = (__typeof__(lval)) _res;                             \
4247*635a8641SAndroid Build Coastguard Worker    } while (0)
4248*635a8641SAndroid Build Coastguard Worker 
4249*635a8641SAndroid Build Coastguard Worker #endif /* PLAT_ppc64_aix5 */
4250*635a8641SAndroid Build Coastguard Worker 
4251*635a8641SAndroid Build Coastguard Worker 
4252*635a8641SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
4253*635a8641SAndroid Build Coastguard Worker /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS.               */
4254*635a8641SAndroid Build Coastguard Worker /*                                                                    */
4255*635a8641SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
4256*635a8641SAndroid Build Coastguard Worker 
4257*635a8641SAndroid Build Coastguard Worker /* Some request codes.  There are many more of these, but most are not
4258*635a8641SAndroid Build Coastguard Worker    exposed to end-user view.  These are the public ones, all of the
4259*635a8641SAndroid Build Coastguard Worker    form 0x1000 + small_number.
4260*635a8641SAndroid Build Coastguard Worker 
4261*635a8641SAndroid Build Coastguard Worker    Core ones are in the range 0x00000000--0x0000ffff.  The non-public
4262*635a8641SAndroid Build Coastguard Worker    ones start at 0x2000.
4263*635a8641SAndroid Build Coastguard Worker */
4264*635a8641SAndroid Build Coastguard Worker 
4265*635a8641SAndroid Build Coastguard Worker /* These macros are used by tools -- they must be public, but don't
4266*635a8641SAndroid Build Coastguard Worker    embed them into other programs. */
4267*635a8641SAndroid Build Coastguard Worker #define VG_USERREQ_TOOL_BASE(a,b) \
4268*635a8641SAndroid Build Coastguard Worker    ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
4269*635a8641SAndroid Build Coastguard Worker #define VG_IS_TOOL_USERREQ(a, b, v) \
4270*635a8641SAndroid Build Coastguard Worker    (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
4271*635a8641SAndroid Build Coastguard Worker 
4272*635a8641SAndroid Build Coastguard Worker /* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
4273*635a8641SAndroid Build Coastguard Worker    This enum comprises an ABI exported by Valgrind to programs
4274*635a8641SAndroid Build Coastguard Worker    which use client requests.  DO NOT CHANGE THE ORDER OF THESE
4275*635a8641SAndroid Build Coastguard Worker    ENTRIES, NOR DELETE ANY -- add new ones at the end. */
4276*635a8641SAndroid Build Coastguard Worker typedef
4277*635a8641SAndroid Build Coastguard Worker    enum { VG_USERREQ__RUNNING_ON_VALGRIND  = 0x1001,
4278*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
4279*635a8641SAndroid Build Coastguard Worker 
4280*635a8641SAndroid Build Coastguard Worker           /* These allow any function to be called from the simulated
4281*635a8641SAndroid Build Coastguard Worker              CPU but run on the real CPU.  Nb: the first arg passed to
4282*635a8641SAndroid Build Coastguard Worker              the function is always the ThreadId of the running
4283*635a8641SAndroid Build Coastguard Worker              thread!  So CLIENT_CALL0 actually requires a 1 arg
4284*635a8641SAndroid Build Coastguard Worker              function, etc. */
4285*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__CLIENT_CALL0 = 0x1101,
4286*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__CLIENT_CALL1 = 0x1102,
4287*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__CLIENT_CALL2 = 0x1103,
4288*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__CLIENT_CALL3 = 0x1104,
4289*635a8641SAndroid Build Coastguard Worker 
4290*635a8641SAndroid Build Coastguard Worker           /* Can be useful in regression testing suites -- eg. can
4291*635a8641SAndroid Build Coastguard Worker              send Valgrind's output to /dev/null and still count
4292*635a8641SAndroid Build Coastguard Worker              errors. */
4293*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__COUNT_ERRORS = 0x1201,
4294*635a8641SAndroid Build Coastguard Worker 
4295*635a8641SAndroid Build Coastguard Worker           /* These are useful and can be interpreted by any tool that
4296*635a8641SAndroid Build Coastguard Worker              tracks malloc() et al, by using vg_replace_malloc.c. */
4297*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
4298*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__FREELIKE_BLOCK   = 0x1302,
4299*635a8641SAndroid Build Coastguard Worker           /* Memory pool support. */
4300*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__CREATE_MEMPOOL   = 0x1303,
4301*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__DESTROY_MEMPOOL  = 0x1304,
4302*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_ALLOC    = 0x1305,
4303*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_FREE     = 0x1306,
4304*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_TRIM     = 0x1307,
4305*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__MOVE_MEMPOOL     = 0x1308,
4306*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_CHANGE   = 0x1309,
4307*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__MEMPOOL_EXISTS   = 0x130a,
4308*635a8641SAndroid Build Coastguard Worker 
4309*635a8641SAndroid Build Coastguard Worker           /* Allow printfs to valgrind log. */
4310*635a8641SAndroid Build Coastguard Worker           /* The first two pass the va_list argument by value, which
4311*635a8641SAndroid Build Coastguard Worker              assumes it is the same size as or smaller than a UWord,
4312*635a8641SAndroid Build Coastguard Worker              which generally isn't the case.  Hence are deprecated.
4313*635a8641SAndroid Build Coastguard Worker              The second two pass the vargs by reference and so are
4314*635a8641SAndroid Build Coastguard Worker              immune to this problem. */
4315*635a8641SAndroid Build Coastguard Worker           /* both :: char* fmt, va_list vargs (DEPRECATED) */
4316*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__PRINTF           = 0x1401,
4317*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
4318*635a8641SAndroid Build Coastguard Worker           /* both :: char* fmt, va_list* vargs */
4319*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403,
4320*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404,
4321*635a8641SAndroid Build Coastguard Worker 
4322*635a8641SAndroid Build Coastguard Worker           /* Stack support. */
4323*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__STACK_REGISTER   = 0x1501,
4324*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__STACK_DEREGISTER = 0x1502,
4325*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__STACK_CHANGE     = 0x1503,
4326*635a8641SAndroid Build Coastguard Worker 
4327*635a8641SAndroid Build Coastguard Worker           /* Wine support */
4328*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601,
4329*635a8641SAndroid Build Coastguard Worker 
4330*635a8641SAndroid Build Coastguard Worker           /* Querying of debug info. */
4331*635a8641SAndroid Build Coastguard Worker           VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701
4332*635a8641SAndroid Build Coastguard Worker    } Vg_ClientRequest;
4333*635a8641SAndroid Build Coastguard Worker 
4334*635a8641SAndroid Build Coastguard Worker #if !defined(__GNUC__)
4335*635a8641SAndroid Build Coastguard Worker #  define __extension__ /* */
4336*635a8641SAndroid Build Coastguard Worker #endif
4337*635a8641SAndroid Build Coastguard Worker 
4338*635a8641SAndroid Build Coastguard Worker 
4339*635a8641SAndroid Build Coastguard Worker /*
4340*635a8641SAndroid Build Coastguard Worker  * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind
4341*635a8641SAndroid Build Coastguard Worker  * client request and whose value equals the client request result.
4342*635a8641SAndroid Build Coastguard Worker  */
4343*635a8641SAndroid Build Coastguard Worker 
4344*635a8641SAndroid Build Coastguard Worker #if defined(NVALGRIND)
4345*635a8641SAndroid Build Coastguard Worker 
4346*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                               \
4347*635a8641SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                                    \
4348*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)         \
4349*635a8641SAndroid Build Coastguard Worker    (_zzq_default)
4350*635a8641SAndroid Build Coastguard Worker 
4351*635a8641SAndroid Build Coastguard Worker #else /*defined(NVALGRIND)*/
4352*635a8641SAndroid Build Coastguard Worker 
4353*635a8641SAndroid Build Coastguard Worker #if defined(_MSC_VER)
4354*635a8641SAndroid Build Coastguard Worker 
4355*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                                \
4356*635a8641SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                                     \
4357*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)          \
4358*635a8641SAndroid Build Coastguard Worker    (vg_VALGRIND_DO_CLIENT_REQUEST_EXPR((uintptr_t)(_zzq_default),       \
4359*635a8641SAndroid Build Coastguard Worker         (_zzq_request), (uintptr_t)(_zzq_arg1), (uintptr_t)(_zzq_arg2), \
4360*635a8641SAndroid Build Coastguard Worker         (uintptr_t)(_zzq_arg3), (uintptr_t)(_zzq_arg4),                 \
4361*635a8641SAndroid Build Coastguard Worker         (uintptr_t)(_zzq_arg5)))
4362*635a8641SAndroid Build Coastguard Worker 
4363*635a8641SAndroid Build Coastguard Worker static __inline unsigned
vg_VALGRIND_DO_CLIENT_REQUEST_EXPR(uintptr_t _zzq_default,unsigned _zzq_request,uintptr_t _zzq_arg1,uintptr_t _zzq_arg2,uintptr_t _zzq_arg3,uintptr_t _zzq_arg4,uintptr_t _zzq_arg5)4364*635a8641SAndroid Build Coastguard Worker vg_VALGRIND_DO_CLIENT_REQUEST_EXPR(uintptr_t _zzq_default,
4365*635a8641SAndroid Build Coastguard Worker                                    unsigned _zzq_request, uintptr_t _zzq_arg1,
4366*635a8641SAndroid Build Coastguard Worker                                    uintptr_t _zzq_arg2, uintptr_t _zzq_arg3,
4367*635a8641SAndroid Build Coastguard Worker                                    uintptr_t _zzq_arg4, uintptr_t _zzq_arg5)
4368*635a8641SAndroid Build Coastguard Worker {
4369*635a8641SAndroid Build Coastguard Worker     unsigned _zzq_rlval;
4370*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, _zzq_request,
4371*635a8641SAndroid Build Coastguard Worker                       _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5);
4372*635a8641SAndroid Build Coastguard Worker     return _zzq_rlval;
4373*635a8641SAndroid Build Coastguard Worker }
4374*635a8641SAndroid Build Coastguard Worker 
4375*635a8641SAndroid Build Coastguard Worker #else /*defined(_MSC_VER)*/
4376*635a8641SAndroid Build Coastguard Worker 
4377*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR(                               \
4378*635a8641SAndroid Build Coastguard Worker         _zzq_default, _zzq_request,                                    \
4379*635a8641SAndroid Build Coastguard Worker         _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)         \
4380*635a8641SAndroid Build Coastguard Worker    (__extension__({unsigned int _zzq_rlval;                            \
4381*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, _zzq_request, \
4382*635a8641SAndroid Build Coastguard Worker                 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
4383*635a8641SAndroid Build Coastguard Worker     _zzq_rlval;                                                        \
4384*635a8641SAndroid Build Coastguard Worker    }))
4385*635a8641SAndroid Build Coastguard Worker 
4386*635a8641SAndroid Build Coastguard Worker #endif /*defined(_MSC_VER)*/
4387*635a8641SAndroid Build Coastguard Worker 
4388*635a8641SAndroid Build Coastguard Worker #endif /*defined(NVALGRIND)*/
4389*635a8641SAndroid Build Coastguard Worker 
4390*635a8641SAndroid Build Coastguard Worker 
4391*635a8641SAndroid Build Coastguard Worker /* Returns the number of Valgrinds this code is running under.  That
4392*635a8641SAndroid Build Coastguard Worker    is, 0 if running natively, 1 if running under Valgrind, 2 if
4393*635a8641SAndroid Build Coastguard Worker    running under Valgrind which is running under another Valgrind,
4394*635a8641SAndroid Build Coastguard Worker    etc. */
4395*635a8641SAndroid Build Coastguard Worker #define RUNNING_ON_VALGRIND                                           \
4396*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */,                   \
4397*635a8641SAndroid Build Coastguard Worker                                     VG_USERREQ__RUNNING_ON_VALGRIND,  \
4398*635a8641SAndroid Build Coastguard Worker                                     0, 0, 0, 0, 0)                    \
4399*635a8641SAndroid Build Coastguard Worker 
4400*635a8641SAndroid Build Coastguard Worker 
4401*635a8641SAndroid Build Coastguard Worker /* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
4402*635a8641SAndroid Build Coastguard Worker    _qzz_len - 1].  Useful if you are debugging a JITter or some such,
4403*635a8641SAndroid Build Coastguard Worker    since it provides a way to make sure valgrind will retranslate the
4404*635a8641SAndroid Build Coastguard Worker    invalidated area.  Returns no value. */
4405*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len)         \
4406*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4407*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4408*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__DISCARD_TRANSLATIONS,  \
4409*635a8641SAndroid Build Coastguard Worker                                _qzz_addr, _qzz_len, 0, 0, 0);     \
4410*635a8641SAndroid Build Coastguard Worker    }
4411*635a8641SAndroid Build Coastguard Worker 
4412*635a8641SAndroid Build Coastguard Worker 
4413*635a8641SAndroid Build Coastguard Worker /* These requests are for getting Valgrind itself to print something.
4414*635a8641SAndroid Build Coastguard Worker    Possibly with a backtrace.  This is a really ugly hack.  The return value
4415*635a8641SAndroid Build Coastguard Worker    is the number of characters printed, excluding the "**<pid>** " part at the
4416*635a8641SAndroid Build Coastguard Worker    start and the backtrace (if present). */
4417*635a8641SAndroid Build Coastguard Worker 
4418*635a8641SAndroid Build Coastguard Worker #if defined(NVALGRIND)
4419*635a8641SAndroid Build Coastguard Worker 
4420*635a8641SAndroid Build Coastguard Worker #  define VALGRIND_PRINTF(...)
4421*635a8641SAndroid Build Coastguard Worker #  define VALGRIND_PRINTF_BACKTRACE(...)
4422*635a8641SAndroid Build Coastguard Worker 
4423*635a8641SAndroid Build Coastguard Worker #else /* NVALGRIND */
4424*635a8641SAndroid Build Coastguard Worker 
4425*635a8641SAndroid Build Coastguard Worker #if !defined(_MSC_VER)
4426*635a8641SAndroid Build Coastguard Worker /* Modern GCC will optimize the static routine out if unused,
4427*635a8641SAndroid Build Coastguard Worker    and unused attribute will shut down warnings about it.  */
4428*635a8641SAndroid Build Coastguard Worker static int VALGRIND_PRINTF(const char *format, ...)
4429*635a8641SAndroid Build Coastguard Worker    __attribute__((format(__printf__, 1, 2), __unused__));
4430*635a8641SAndroid Build Coastguard Worker #endif
4431*635a8641SAndroid Build Coastguard Worker static int
4432*635a8641SAndroid Build Coastguard Worker #if defined(_MSC_VER)
4433*635a8641SAndroid Build Coastguard Worker __inline
4434*635a8641SAndroid Build Coastguard Worker #endif
VALGRIND_PRINTF(const char * format,...)4435*635a8641SAndroid Build Coastguard Worker VALGRIND_PRINTF(const char *format, ...)
4436*635a8641SAndroid Build Coastguard Worker {
4437*635a8641SAndroid Build Coastguard Worker    unsigned long _qzz_res;
4438*635a8641SAndroid Build Coastguard Worker    va_list vargs;
4439*635a8641SAndroid Build Coastguard Worker    va_start(vargs, format);
4440*635a8641SAndroid Build Coastguard Worker #if defined(_MSC_VER)
4441*635a8641SAndroid Build Coastguard Worker    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,
4442*635a8641SAndroid Build Coastguard Worker                               VG_USERREQ__PRINTF_VALIST_BY_REF,
4443*635a8641SAndroid Build Coastguard Worker                               (uintptr_t)format,
4444*635a8641SAndroid Build Coastguard Worker                               (uintptr_t)&vargs,
4445*635a8641SAndroid Build Coastguard Worker                               0, 0, 0);
4446*635a8641SAndroid Build Coastguard Worker #else
4447*635a8641SAndroid Build Coastguard Worker    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,
4448*635a8641SAndroid Build Coastguard Worker                               VG_USERREQ__PRINTF_VALIST_BY_REF,
4449*635a8641SAndroid Build Coastguard Worker                               (unsigned long)format,
4450*635a8641SAndroid Build Coastguard Worker                               (unsigned long)&vargs,
4451*635a8641SAndroid Build Coastguard Worker                               0, 0, 0);
4452*635a8641SAndroid Build Coastguard Worker #endif
4453*635a8641SAndroid Build Coastguard Worker    va_end(vargs);
4454*635a8641SAndroid Build Coastguard Worker    return (int)_qzz_res;
4455*635a8641SAndroid Build Coastguard Worker }
4456*635a8641SAndroid Build Coastguard Worker 
4457*635a8641SAndroid Build Coastguard Worker #if !defined(_MSC_VER)
4458*635a8641SAndroid Build Coastguard Worker static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
4459*635a8641SAndroid Build Coastguard Worker    __attribute__((format(__printf__, 1, 2), __unused__));
4460*635a8641SAndroid Build Coastguard Worker #endif
4461*635a8641SAndroid Build Coastguard Worker static int
4462*635a8641SAndroid Build Coastguard Worker #if defined(_MSC_VER)
4463*635a8641SAndroid Build Coastguard Worker __inline
4464*635a8641SAndroid Build Coastguard Worker #endif
VALGRIND_PRINTF_BACKTRACE(const char * format,...)4465*635a8641SAndroid Build Coastguard Worker VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
4466*635a8641SAndroid Build Coastguard Worker {
4467*635a8641SAndroid Build Coastguard Worker    unsigned long _qzz_res;
4468*635a8641SAndroid Build Coastguard Worker    va_list vargs;
4469*635a8641SAndroid Build Coastguard Worker    va_start(vargs, format);
4470*635a8641SAndroid Build Coastguard Worker #if defined(_MSC_VER)
4471*635a8641SAndroid Build Coastguard Worker    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,
4472*635a8641SAndroid Build Coastguard Worker                               VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
4473*635a8641SAndroid Build Coastguard Worker                               (uintptr_t)format,
4474*635a8641SAndroid Build Coastguard Worker                               (uintptr_t)&vargs,
4475*635a8641SAndroid Build Coastguard Worker                               0, 0, 0);
4476*635a8641SAndroid Build Coastguard Worker #else
4477*635a8641SAndroid Build Coastguard Worker    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,
4478*635a8641SAndroid Build Coastguard Worker                               VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
4479*635a8641SAndroid Build Coastguard Worker                               (unsigned long)format,
4480*635a8641SAndroid Build Coastguard Worker                               (unsigned long)&vargs,
4481*635a8641SAndroid Build Coastguard Worker                               0, 0, 0);
4482*635a8641SAndroid Build Coastguard Worker #endif
4483*635a8641SAndroid Build Coastguard Worker    va_end(vargs);
4484*635a8641SAndroid Build Coastguard Worker    return (int)_qzz_res;
4485*635a8641SAndroid Build Coastguard Worker }
4486*635a8641SAndroid Build Coastguard Worker 
4487*635a8641SAndroid Build Coastguard Worker #endif /* NVALGRIND */
4488*635a8641SAndroid Build Coastguard Worker 
4489*635a8641SAndroid Build Coastguard Worker 
4490*635a8641SAndroid Build Coastguard Worker /* These requests allow control to move from the simulated CPU to the
4491*635a8641SAndroid Build Coastguard Worker    real CPU, calling an arbitary function.
4492*635a8641SAndroid Build Coastguard Worker 
4493*635a8641SAndroid Build Coastguard Worker    Note that the current ThreadId is inserted as the first argument.
4494*635a8641SAndroid Build Coastguard Worker    So this call:
4495*635a8641SAndroid Build Coastguard Worker 
4496*635a8641SAndroid Build Coastguard Worker      VALGRIND_NON_SIMD_CALL2(f, arg1, arg2)
4497*635a8641SAndroid Build Coastguard Worker 
4498*635a8641SAndroid Build Coastguard Worker    requires f to have this signature:
4499*635a8641SAndroid Build Coastguard Worker 
4500*635a8641SAndroid Build Coastguard Worker      Word f(Word tid, Word arg1, Word arg2)
4501*635a8641SAndroid Build Coastguard Worker 
4502*635a8641SAndroid Build Coastguard Worker    where "Word" is a word-sized type.
4503*635a8641SAndroid Build Coastguard Worker 
4504*635a8641SAndroid Build Coastguard Worker    Note that these client requests are not entirely reliable.  For example,
4505*635a8641SAndroid Build Coastguard Worker    if you call a function with them that subsequently calls printf(),
4506*635a8641SAndroid Build Coastguard Worker    there's a high chance Valgrind will crash.  Generally, your prospects of
4507*635a8641SAndroid Build Coastguard Worker    these working are made higher if the called function does not refer to
4508*635a8641SAndroid Build Coastguard Worker    any global variables, and does not refer to any libc or other functions
4509*635a8641SAndroid Build Coastguard Worker    (printf et al).  Any kind of entanglement with libc or dynamic linking is
4510*635a8641SAndroid Build Coastguard Worker    likely to have a bad outcome, for tricky reasons which we've grappled
4511*635a8641SAndroid Build Coastguard Worker    with a lot in the past.
4512*635a8641SAndroid Build Coastguard Worker */
4513*635a8641SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL0(_qyy_fn)                          \
4514*635a8641SAndroid Build Coastguard Worker    __extension__                                                  \
4515*635a8641SAndroid Build Coastguard Worker    ({unsigned long _qyy_res;                                      \
4516*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
4517*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__CLIENT_CALL0,          \
4518*635a8641SAndroid Build Coastguard Worker                                _qyy_fn,                           \
4519*635a8641SAndroid Build Coastguard Worker                                0, 0, 0, 0);                       \
4520*635a8641SAndroid Build Coastguard Worker     _qyy_res;                                                     \
4521*635a8641SAndroid Build Coastguard Worker    })
4522*635a8641SAndroid Build Coastguard Worker 
4523*635a8641SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1)               \
4524*635a8641SAndroid Build Coastguard Worker    __extension__                                                  \
4525*635a8641SAndroid Build Coastguard Worker    ({unsigned long _qyy_res;                                      \
4526*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
4527*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__CLIENT_CALL1,          \
4528*635a8641SAndroid Build Coastguard Worker                                _qyy_fn,                           \
4529*635a8641SAndroid Build Coastguard Worker                                _qyy_arg1, 0, 0, 0);               \
4530*635a8641SAndroid Build Coastguard Worker     _qyy_res;                                                     \
4531*635a8641SAndroid Build Coastguard Worker    })
4532*635a8641SAndroid Build Coastguard Worker 
4533*635a8641SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2)    \
4534*635a8641SAndroid Build Coastguard Worker    __extension__                                                  \
4535*635a8641SAndroid Build Coastguard Worker    ({unsigned long _qyy_res;                                      \
4536*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
4537*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__CLIENT_CALL2,          \
4538*635a8641SAndroid Build Coastguard Worker                                _qyy_fn,                           \
4539*635a8641SAndroid Build Coastguard Worker                                _qyy_arg1, _qyy_arg2, 0, 0);       \
4540*635a8641SAndroid Build Coastguard Worker     _qyy_res;                                                     \
4541*635a8641SAndroid Build Coastguard Worker    })
4542*635a8641SAndroid Build Coastguard Worker 
4543*635a8641SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
4544*635a8641SAndroid Build Coastguard Worker    __extension__                                                  \
4545*635a8641SAndroid Build Coastguard Worker    ({unsigned long _qyy_res;                                      \
4546*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
4547*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__CLIENT_CALL3,          \
4548*635a8641SAndroid Build Coastguard Worker                                _qyy_fn,                           \
4549*635a8641SAndroid Build Coastguard Worker                                _qyy_arg1, _qyy_arg2,              \
4550*635a8641SAndroid Build Coastguard Worker                                _qyy_arg3, 0);                     \
4551*635a8641SAndroid Build Coastguard Worker     _qyy_res;                                                     \
4552*635a8641SAndroid Build Coastguard Worker    })
4553*635a8641SAndroid Build Coastguard Worker 
4554*635a8641SAndroid Build Coastguard Worker 
4555*635a8641SAndroid Build Coastguard Worker /* Counts the number of errors that have been recorded by a tool.  Nb:
4556*635a8641SAndroid Build Coastguard Worker    the tool must record the errors with VG_(maybe_record_error)() or
4557*635a8641SAndroid Build Coastguard Worker    VG_(unique_error)() for them to be counted. */
4558*635a8641SAndroid Build Coastguard Worker #define VALGRIND_COUNT_ERRORS                                     \
4559*635a8641SAndroid Build Coastguard Worker    __extension__                                                  \
4560*635a8641SAndroid Build Coastguard Worker    ({unsigned int _qyy_res;                                       \
4561*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */,  \
4562*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__COUNT_ERRORS,          \
4563*635a8641SAndroid Build Coastguard Worker                                0, 0, 0, 0, 0);                    \
4564*635a8641SAndroid Build Coastguard Worker     _qyy_res;                                                     \
4565*635a8641SAndroid Build Coastguard Worker    })
4566*635a8641SAndroid Build Coastguard Worker 
4567*635a8641SAndroid Build Coastguard Worker /* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing
4568*635a8641SAndroid Build Coastguard Worker    when heap blocks are allocated in order to give accurate results.  This
4569*635a8641SAndroid Build Coastguard Worker    happens automatically for the standard allocator functions such as
4570*635a8641SAndroid Build Coastguard Worker    malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete,
4571*635a8641SAndroid Build Coastguard Worker    delete[], etc.
4572*635a8641SAndroid Build Coastguard Worker 
4573*635a8641SAndroid Build Coastguard Worker    But if your program uses a custom allocator, this doesn't automatically
4574*635a8641SAndroid Build Coastguard Worker    happen, and Valgrind will not do as well.  For example, if you allocate
4575*635a8641SAndroid Build Coastguard Worker    superblocks with mmap() and then allocates chunks of the superblocks, all
4576*635a8641SAndroid Build Coastguard Worker    Valgrind's observations will be at the mmap() level and it won't know that
4577*635a8641SAndroid Build Coastguard Worker    the chunks should be considered separate entities.  In Memcheck's case,
4578*635a8641SAndroid Build Coastguard Worker    that means you probably won't get heap block overrun detection (because
4579*635a8641SAndroid Build Coastguard Worker    there won't be redzones marked as unaddressable) and you definitely won't
4580*635a8641SAndroid Build Coastguard Worker    get any leak detection.
4581*635a8641SAndroid Build Coastguard Worker 
4582*635a8641SAndroid Build Coastguard Worker    The following client requests allow a custom allocator to be annotated so
4583*635a8641SAndroid Build Coastguard Worker    that it can be handled accurately by Valgrind.
4584*635a8641SAndroid Build Coastguard Worker 
4585*635a8641SAndroid Build Coastguard Worker    VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated
4586*635a8641SAndroid Build Coastguard Worker    by a malloc()-like function.  For Memcheck (an illustrative case), this
4587*635a8641SAndroid Build Coastguard Worker    does two things:
4588*635a8641SAndroid Build Coastguard Worker 
4589*635a8641SAndroid Build Coastguard Worker    - It records that the block has been allocated.  This means any addresses
4590*635a8641SAndroid Build Coastguard Worker      within the block mentioned in error messages will be
4591*635a8641SAndroid Build Coastguard Worker      identified as belonging to the block.  It also means that if the block
4592*635a8641SAndroid Build Coastguard Worker      isn't freed it will be detected by the leak checker.
4593*635a8641SAndroid Build Coastguard Worker 
4594*635a8641SAndroid Build Coastguard Worker    - It marks the block as being addressable and undefined (if 'is_zeroed' is
4595*635a8641SAndroid Build Coastguard Worker      not set), or addressable and defined (if 'is_zeroed' is set).  This
4596*635a8641SAndroid Build Coastguard Worker      controls how accesses to the block by the program are handled.
4597*635a8641SAndroid Build Coastguard Worker 
4598*635a8641SAndroid Build Coastguard Worker    'addr' is the start of the usable block (ie. after any
4599*635a8641SAndroid Build Coastguard Worker    redzone), 'sizeB' is its size.  'rzB' is the redzone size if the allocator
4600*635a8641SAndroid Build Coastguard Worker    can apply redzones -- these are blocks of padding at the start and end of
4601*635a8641SAndroid Build Coastguard Worker    each block.  Adding redzones is recommended as it makes it much more likely
4602*635a8641SAndroid Build Coastguard Worker    Valgrind will spot block overruns.  `is_zeroed' indicates if the memory is
4603*635a8641SAndroid Build Coastguard Worker    zeroed (or filled with another predictable value), as is the case for
4604*635a8641SAndroid Build Coastguard Worker    calloc().
4605*635a8641SAndroid Build Coastguard Worker 
4606*635a8641SAndroid Build Coastguard Worker    VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a
4607*635a8641SAndroid Build Coastguard Worker    heap block -- that will be used by the client program -- is allocated.
4608*635a8641SAndroid Build Coastguard Worker    It's best to put it at the outermost level of the allocator if possible;
4609*635a8641SAndroid Build Coastguard Worker    for example, if you have a function my_alloc() which calls
4610*635a8641SAndroid Build Coastguard Worker    internal_alloc(), and the client request is put inside internal_alloc(),
4611*635a8641SAndroid Build Coastguard Worker    stack traces relating to the heap block will contain entries for both
4612*635a8641SAndroid Build Coastguard Worker    my_alloc() and internal_alloc(), which is probably not what you want.
4613*635a8641SAndroid Build Coastguard Worker 
4614*635a8641SAndroid Build Coastguard Worker    For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out
4615*635a8641SAndroid Build Coastguard Worker    custom blocks from within a heap block, B, that has been allocated with
4616*635a8641SAndroid Build Coastguard Worker    malloc/calloc/new/etc, then block B will be *ignored* during leak-checking
4617*635a8641SAndroid Build Coastguard Worker    -- the custom blocks will take precedence.
4618*635a8641SAndroid Build Coastguard Worker 
4619*635a8641SAndroid Build Coastguard Worker    VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK.  For
4620*635a8641SAndroid Build Coastguard Worker    Memcheck, it does two things:
4621*635a8641SAndroid Build Coastguard Worker 
4622*635a8641SAndroid Build Coastguard Worker    - It records that the block has been deallocated.  This assumes that the
4623*635a8641SAndroid Build Coastguard Worker      block was annotated as having been allocated via
4624*635a8641SAndroid Build Coastguard Worker      VALGRIND_MALLOCLIKE_BLOCK.  Otherwise, an error will be issued.
4625*635a8641SAndroid Build Coastguard Worker 
4626*635a8641SAndroid Build Coastguard Worker    - It marks the block as being unaddressable.
4627*635a8641SAndroid Build Coastguard Worker 
4628*635a8641SAndroid Build Coastguard Worker    VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a
4629*635a8641SAndroid Build Coastguard Worker    heap block is deallocated.
4630*635a8641SAndroid Build Coastguard Worker 
4631*635a8641SAndroid Build Coastguard Worker    In many cases, these two client requests will not be enough to get your
4632*635a8641SAndroid Build Coastguard Worker    allocator working well with Memcheck.  More specifically, if your allocator
4633*635a8641SAndroid Build Coastguard Worker    writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call
4634*635a8641SAndroid Build Coastguard Worker    will be necessary to mark the memory as addressable just before the zeroing
4635*635a8641SAndroid Build Coastguard Worker    occurs, otherwise you'll get a lot of invalid write errors.  For example,
4636*635a8641SAndroid Build Coastguard Worker    you'll need to do this if your allocator recycles freed blocks, but it
4637*635a8641SAndroid Build Coastguard Worker    zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK).
4638*635a8641SAndroid Build Coastguard Worker    Alternatively, if your allocator reuses freed blocks for allocator-internal
4639*635a8641SAndroid Build Coastguard Worker    data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary.
4640*635a8641SAndroid Build Coastguard Worker 
4641*635a8641SAndroid Build Coastguard Worker    Really, what's happening is a blurring of the lines between the client
4642*635a8641SAndroid Build Coastguard Worker    program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the
4643*635a8641SAndroid Build Coastguard Worker    memory should be considered unaddressable to the client program, but the
4644*635a8641SAndroid Build Coastguard Worker    allocator knows more than the rest of the client program and so may be able
4645*635a8641SAndroid Build Coastguard Worker    to safely access it.  Extra client requests are necessary for Valgrind to
4646*635a8641SAndroid Build Coastguard Worker    understand the distinction between the allocator and the rest of the
4647*635a8641SAndroid Build Coastguard Worker    program.
4648*635a8641SAndroid Build Coastguard Worker 
4649*635a8641SAndroid Build Coastguard Worker    Note: there is currently no VALGRIND_REALLOCLIKE_BLOCK client request;  it
4650*635a8641SAndroid Build Coastguard Worker    has to be emulated with MALLOCLIKE/FREELIKE and memory copying.
4651*635a8641SAndroid Build Coastguard Worker 
4652*635a8641SAndroid Build Coastguard Worker    Ignored if addr == 0.
4653*635a8641SAndroid Build Coastguard Worker */
4654*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)    \
4655*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4656*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4657*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__MALLOCLIKE_BLOCK,      \
4658*635a8641SAndroid Build Coastguard Worker                                addr, sizeB, rzB, is_zeroed, 0);   \
4659*635a8641SAndroid Build Coastguard Worker    }
4660*635a8641SAndroid Build Coastguard Worker 
4661*635a8641SAndroid Build Coastguard Worker /* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
4662*635a8641SAndroid Build Coastguard Worker    Ignored if addr == 0.
4663*635a8641SAndroid Build Coastguard Worker */
4664*635a8641SAndroid Build Coastguard Worker #define VALGRIND_FREELIKE_BLOCK(addr, rzB)                        \
4665*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4666*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4667*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__FREELIKE_BLOCK,        \
4668*635a8641SAndroid Build Coastguard Worker                                addr, rzB, 0, 0, 0);               \
4669*635a8641SAndroid Build Coastguard Worker    }
4670*635a8641SAndroid Build Coastguard Worker 
4671*635a8641SAndroid Build Coastguard Worker /* Create a memory pool. */
4672*635a8641SAndroid Build Coastguard Worker #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed)             \
4673*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4674*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4675*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__CREATE_MEMPOOL,        \
4676*635a8641SAndroid Build Coastguard Worker                                pool, rzB, is_zeroed, 0, 0);       \
4677*635a8641SAndroid Build Coastguard Worker    }
4678*635a8641SAndroid Build Coastguard Worker 
4679*635a8641SAndroid Build Coastguard Worker /* Destroy a memory pool. */
4680*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DESTROY_MEMPOOL(pool)                            \
4681*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4682*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4683*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__DESTROY_MEMPOOL,       \
4684*635a8641SAndroid Build Coastguard Worker                                pool, 0, 0, 0, 0);                 \
4685*635a8641SAndroid Build Coastguard Worker    }
4686*635a8641SAndroid Build Coastguard Worker 
4687*635a8641SAndroid Build Coastguard Worker /* Associate a piece of memory with a memory pool. */
4688*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size)                  \
4689*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4690*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4691*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__MEMPOOL_ALLOC,         \
4692*635a8641SAndroid Build Coastguard Worker                                pool, addr, size, 0, 0);           \
4693*635a8641SAndroid Build Coastguard Worker    }
4694*635a8641SAndroid Build Coastguard Worker 
4695*635a8641SAndroid Build Coastguard Worker /* Disassociate a piece of memory from a memory pool. */
4696*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_FREE(pool, addr)                         \
4697*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4698*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4699*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__MEMPOOL_FREE,          \
4700*635a8641SAndroid Build Coastguard Worker                                pool, addr, 0, 0, 0);              \
4701*635a8641SAndroid Build Coastguard Worker    }
4702*635a8641SAndroid Build Coastguard Worker 
4703*635a8641SAndroid Build Coastguard Worker /* Disassociate any pieces outside a particular range. */
4704*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_TRIM(pool, addr, size)                   \
4705*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4706*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4707*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__MEMPOOL_TRIM,          \
4708*635a8641SAndroid Build Coastguard Worker                                pool, addr, size, 0, 0);           \
4709*635a8641SAndroid Build Coastguard Worker    }
4710*635a8641SAndroid Build Coastguard Worker 
4711*635a8641SAndroid Build Coastguard Worker /* Resize and/or move a piece associated with a memory pool. */
4712*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MOVE_MEMPOOL(poolA, poolB)                       \
4713*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4714*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4715*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__MOVE_MEMPOOL,          \
4716*635a8641SAndroid Build Coastguard Worker                                poolA, poolB, 0, 0, 0);            \
4717*635a8641SAndroid Build Coastguard Worker    }
4718*635a8641SAndroid Build Coastguard Worker 
4719*635a8641SAndroid Build Coastguard Worker /* Resize and/or move a piece associated with a memory pool. */
4720*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size)         \
4721*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4722*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4723*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__MEMPOOL_CHANGE,        \
4724*635a8641SAndroid Build Coastguard Worker                                pool, addrA, addrB, size, 0);      \
4725*635a8641SAndroid Build Coastguard Worker    }
4726*635a8641SAndroid Build Coastguard Worker 
4727*635a8641SAndroid Build Coastguard Worker /* Return 1 if a mempool exists, else 0. */
4728*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_EXISTS(pool)                             \
4729*635a8641SAndroid Build Coastguard Worker    __extension__                                                  \
4730*635a8641SAndroid Build Coastguard Worker    ({unsigned int _qzz_res;                                       \
4731*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4732*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__MEMPOOL_EXISTS,        \
4733*635a8641SAndroid Build Coastguard Worker                                pool, 0, 0, 0, 0);                 \
4734*635a8641SAndroid Build Coastguard Worker     _qzz_res;                                                     \
4735*635a8641SAndroid Build Coastguard Worker    })
4736*635a8641SAndroid Build Coastguard Worker 
4737*635a8641SAndroid Build Coastguard Worker /* Mark a piece of memory as being a stack. Returns a stack id. */
4738*635a8641SAndroid Build Coastguard Worker #define VALGRIND_STACK_REGISTER(start, end)                       \
4739*635a8641SAndroid Build Coastguard Worker    __extension__                                                  \
4740*635a8641SAndroid Build Coastguard Worker    ({unsigned int _qzz_res;                                       \
4741*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4742*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__STACK_REGISTER,        \
4743*635a8641SAndroid Build Coastguard Worker                                start, end, 0, 0, 0);              \
4744*635a8641SAndroid Build Coastguard Worker     _qzz_res;                                                     \
4745*635a8641SAndroid Build Coastguard Worker    })
4746*635a8641SAndroid Build Coastguard Worker 
4747*635a8641SAndroid Build Coastguard Worker /* Unmark the piece of memory associated with a stack id as being a
4748*635a8641SAndroid Build Coastguard Worker    stack. */
4749*635a8641SAndroid Build Coastguard Worker #define VALGRIND_STACK_DEREGISTER(id)                             \
4750*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4751*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4752*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__STACK_DEREGISTER,      \
4753*635a8641SAndroid Build Coastguard Worker                                id, 0, 0, 0, 0);                   \
4754*635a8641SAndroid Build Coastguard Worker    }
4755*635a8641SAndroid Build Coastguard Worker 
4756*635a8641SAndroid Build Coastguard Worker /* Change the start and end address of the stack id. */
4757*635a8641SAndroid Build Coastguard Worker #define VALGRIND_STACK_CHANGE(id, start, end)                     \
4758*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4759*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4760*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__STACK_CHANGE,          \
4761*635a8641SAndroid Build Coastguard Worker                                id, start, end, 0, 0);             \
4762*635a8641SAndroid Build Coastguard Worker    }
4763*635a8641SAndroid Build Coastguard Worker 
4764*635a8641SAndroid Build Coastguard Worker /* Load PDB debug info for Wine PE image_map. */
4765*635a8641SAndroid Build Coastguard Worker #define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta)   \
4766*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4767*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4768*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__LOAD_PDB_DEBUGINFO,    \
4769*635a8641SAndroid Build Coastguard Worker                                fd, ptr, total_size, delta, 0);    \
4770*635a8641SAndroid Build Coastguard Worker    }
4771*635a8641SAndroid Build Coastguard Worker 
4772*635a8641SAndroid Build Coastguard Worker /* Map a code address to a source file name and line number.  buf64
4773*635a8641SAndroid Build Coastguard Worker    must point to a 64-byte buffer in the caller's address space.  The
4774*635a8641SAndroid Build Coastguard Worker    result will be dumped in there and is guaranteed to be zero
4775*635a8641SAndroid Build Coastguard Worker    terminated.  If no info is found, the first byte is set to zero. */
4776*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64)                    \
4777*635a8641SAndroid Build Coastguard Worker    {unsigned int _qzz_res;                                        \
4778*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                       \
4779*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__MAP_IP_TO_SRCLOC,      \
4780*635a8641SAndroid Build Coastguard Worker                                addr, buf64, 0, 0, 0);             \
4781*635a8641SAndroid Build Coastguard Worker    }
4782*635a8641SAndroid Build Coastguard Worker 
4783*635a8641SAndroid Build Coastguard Worker 
4784*635a8641SAndroid Build Coastguard Worker #undef PLAT_x86_linux
4785*635a8641SAndroid Build Coastguard Worker #undef PLAT_amd64_linux
4786*635a8641SAndroid Build Coastguard Worker #undef PLAT_ppc32_linux
4787*635a8641SAndroid Build Coastguard Worker #undef PLAT_ppc64_linux
4788*635a8641SAndroid Build Coastguard Worker #undef PLAT_arm_linux
4789*635a8641SAndroid Build Coastguard Worker #undef PLAT_ppc32_aix5
4790*635a8641SAndroid Build Coastguard Worker #undef PLAT_ppc64_aix5
4791*635a8641SAndroid Build Coastguard Worker 
4792*635a8641SAndroid Build Coastguard Worker #endif   /* __VALGRIND_H */
4793