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