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