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