1*da0073e9SAndroid Build Coastguard Worker /* -*- c -*-
2*da0073e9SAndroid Build Coastguard Worker ----------------------------------------------------------------
3*da0073e9SAndroid Build Coastguard Worker
4*da0073e9SAndroid Build Coastguard Worker Notice that the following BSD-style license applies to this one
5*da0073e9SAndroid Build Coastguard Worker file (valgrind.h) only. The rest of Valgrind is licensed under the
6*da0073e9SAndroid Build Coastguard Worker terms of the GNU General Public License, version 2, unless
7*da0073e9SAndroid Build Coastguard Worker otherwise indicated. See the COPYING file in the source
8*da0073e9SAndroid Build Coastguard Worker distribution for details.
9*da0073e9SAndroid Build Coastguard Worker
10*da0073e9SAndroid Build Coastguard Worker ----------------------------------------------------------------
11*da0073e9SAndroid Build Coastguard Worker
12*da0073e9SAndroid Build Coastguard Worker This file is part of Valgrind, a dynamic binary instrumentation
13*da0073e9SAndroid Build Coastguard Worker framework.
14*da0073e9SAndroid Build Coastguard Worker
15*da0073e9SAndroid Build Coastguard Worker Copyright (C) 2000-2017 Julian Seward. All rights reserved.
16*da0073e9SAndroid Build Coastguard Worker
17*da0073e9SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without
18*da0073e9SAndroid Build Coastguard Worker modification, are permitted provided that the following conditions
19*da0073e9SAndroid Build Coastguard Worker are met:
20*da0073e9SAndroid Build Coastguard Worker
21*da0073e9SAndroid Build Coastguard Worker 1. Redistributions of source code must retain the above copyright
22*da0073e9SAndroid Build Coastguard Worker notice, this list of conditions and the following disclaimer.
23*da0073e9SAndroid Build Coastguard Worker
24*da0073e9SAndroid Build Coastguard Worker 2. The origin of this software must not be misrepresented; you must
25*da0073e9SAndroid Build Coastguard Worker not claim that you wrote the original software. If you use this
26*da0073e9SAndroid Build Coastguard Worker software in a product, an acknowledgment in the product
27*da0073e9SAndroid Build Coastguard Worker documentation would be appreciated but is not required.
28*da0073e9SAndroid Build Coastguard Worker
29*da0073e9SAndroid Build Coastguard Worker 3. Altered source versions must be plainly marked as such, and must
30*da0073e9SAndroid Build Coastguard Worker not be misrepresented as being the original software.
31*da0073e9SAndroid Build Coastguard Worker
32*da0073e9SAndroid Build Coastguard Worker 4. The name of the author may not be used to endorse or promote
33*da0073e9SAndroid Build Coastguard Worker products derived from this software without specific prior written
34*da0073e9SAndroid Build Coastguard Worker permission.
35*da0073e9SAndroid Build Coastguard Worker
36*da0073e9SAndroid Build Coastguard Worker THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
37*da0073e9SAndroid Build Coastguard Worker OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
38*da0073e9SAndroid Build Coastguard Worker WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39*da0073e9SAndroid Build Coastguard Worker ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
40*da0073e9SAndroid Build Coastguard Worker DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41*da0073e9SAndroid Build Coastguard Worker DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
42*da0073e9SAndroid Build Coastguard Worker GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
43*da0073e9SAndroid Build Coastguard Worker INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
44*da0073e9SAndroid Build Coastguard Worker WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45*da0073e9SAndroid Build Coastguard Worker NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46*da0073e9SAndroid Build Coastguard Worker SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47*da0073e9SAndroid Build Coastguard Worker
48*da0073e9SAndroid Build Coastguard Worker ----------------------------------------------------------------
49*da0073e9SAndroid Build Coastguard Worker
50*da0073e9SAndroid Build Coastguard Worker Notice that the above BSD-style license applies to this one file
51*da0073e9SAndroid Build Coastguard Worker (valgrind.h) only. The entire rest of Valgrind is licensed under
52*da0073e9SAndroid Build Coastguard Worker the terms of the GNU General Public License, version 2. See the
53*da0073e9SAndroid Build Coastguard Worker COPYING file in the source distribution for details.
54*da0073e9SAndroid Build Coastguard Worker
55*da0073e9SAndroid Build Coastguard Worker ----------------------------------------------------------------
56*da0073e9SAndroid Build Coastguard Worker */
57*da0073e9SAndroid Build Coastguard Worker
58*da0073e9SAndroid Build Coastguard Worker
59*da0073e9SAndroid Build Coastguard Worker /* This file is for inclusion into client (your!) code.
60*da0073e9SAndroid Build Coastguard Worker
61*da0073e9SAndroid Build Coastguard Worker You can use these macros to manipulate and query Valgrind's
62*da0073e9SAndroid Build Coastguard Worker execution inside your own programs.
63*da0073e9SAndroid Build Coastguard Worker
64*da0073e9SAndroid Build Coastguard Worker The resulting executables will still run without Valgrind, just a
65*da0073e9SAndroid Build Coastguard Worker little bit more slowly than they otherwise would, but otherwise
66*da0073e9SAndroid Build Coastguard Worker unchanged. When not running on valgrind, each client request
67*da0073e9SAndroid Build Coastguard Worker consumes very few (eg. 7) instructions, so the resulting performance
68*da0073e9SAndroid Build Coastguard Worker loss is negligible unless you plan to execute client requests
69*da0073e9SAndroid Build Coastguard Worker millions of times per second. Nevertheless, if that is still a
70*da0073e9SAndroid Build Coastguard Worker problem, you can compile with the NVALGRIND symbol defined (gcc
71*da0073e9SAndroid Build Coastguard Worker -DNVALGRIND) so that client requests are not even compiled in. */
72*da0073e9SAndroid Build Coastguard Worker
73*da0073e9SAndroid Build Coastguard Worker #ifndef __VALGRIND_H
74*da0073e9SAndroid Build Coastguard Worker #define __VALGRIND_H
75*da0073e9SAndroid Build Coastguard Worker
76*da0073e9SAndroid Build Coastguard Worker
77*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
78*da0073e9SAndroid Build Coastguard Worker /* VERSION NUMBER OF VALGRIND */
79*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
80*da0073e9SAndroid Build Coastguard Worker
81*da0073e9SAndroid Build Coastguard Worker /* Specify Valgrind's version number, so that user code can
82*da0073e9SAndroid Build Coastguard Worker conditionally compile based on our version number. Note that these
83*da0073e9SAndroid Build Coastguard Worker were introduced at version 3.6 and so do not exist in version 3.5
84*da0073e9SAndroid Build Coastguard Worker or earlier. The recommended way to use them to check for "version
85*da0073e9SAndroid Build Coastguard Worker X.Y or later" is (eg)
86*da0073e9SAndroid Build Coastguard Worker
87*da0073e9SAndroid Build Coastguard Worker #if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__) \
88*da0073e9SAndroid Build Coastguard Worker && (__VALGRIND_MAJOR__ > 3 \
89*da0073e9SAndroid Build Coastguard Worker || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6))
90*da0073e9SAndroid Build Coastguard Worker */
91*da0073e9SAndroid Build Coastguard Worker #define __VALGRIND_MAJOR__ 3
92*da0073e9SAndroid Build Coastguard Worker #define __VALGRIND_MINOR__ 17
93*da0073e9SAndroid Build Coastguard Worker
94*da0073e9SAndroid Build Coastguard Worker
95*da0073e9SAndroid Build Coastguard Worker #include <stdarg.h>
96*da0073e9SAndroid Build Coastguard Worker
97*da0073e9SAndroid Build Coastguard Worker /* Nb: this file might be included in a file compiled with -ansi. So
98*da0073e9SAndroid Build Coastguard Worker we can't use C++ style "//" comments nor the "asm" keyword (instead
99*da0073e9SAndroid Build Coastguard Worker use "__asm__"). */
100*da0073e9SAndroid Build Coastguard Worker
101*da0073e9SAndroid Build Coastguard Worker /* Derive some tags indicating what the target platform is. Note
102*da0073e9SAndroid Build Coastguard Worker that in this file we're using the compiler's CPP symbols for
103*da0073e9SAndroid Build Coastguard Worker identifying architectures, which are different to the ones we use
104*da0073e9SAndroid Build Coastguard Worker within the rest of Valgrind. Note, __powerpc__ is active for both
105*da0073e9SAndroid Build Coastguard Worker 32 and 64-bit PPC, whereas __powerpc64__ is only active for the
106*da0073e9SAndroid Build Coastguard Worker latter (on Linux, that is).
107*da0073e9SAndroid Build Coastguard Worker
108*da0073e9SAndroid Build Coastguard Worker Misc note: how to find out what's predefined in gcc by default:
109*da0073e9SAndroid Build Coastguard Worker gcc -Wp,-dM somefile.c
110*da0073e9SAndroid Build Coastguard Worker */
111*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_darwin
112*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_darwin
113*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_win32
114*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_win64
115*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_linux
116*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_linux
117*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc32_linux
118*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc64be_linux
119*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc64le_linux
120*da0073e9SAndroid Build Coastguard Worker #undef PLAT_arm_linux
121*da0073e9SAndroid Build Coastguard Worker #undef PLAT_arm64_linux
122*da0073e9SAndroid Build Coastguard Worker #undef PLAT_s390x_linux
123*da0073e9SAndroid Build Coastguard Worker #undef PLAT_mips32_linux
124*da0073e9SAndroid Build Coastguard Worker #undef PLAT_mips64_linux
125*da0073e9SAndroid Build Coastguard Worker #undef PLAT_nanomips_linux
126*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_solaris
127*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_solaris
128*da0073e9SAndroid Build Coastguard Worker
129*da0073e9SAndroid Build Coastguard Worker
130*da0073e9SAndroid Build Coastguard Worker #if defined(__APPLE__) && defined(__i386__)
131*da0073e9SAndroid Build Coastguard Worker # define PLAT_x86_darwin 1
132*da0073e9SAndroid Build Coastguard Worker #elif defined(__APPLE__) && defined(__x86_64__)
133*da0073e9SAndroid Build Coastguard Worker # define PLAT_amd64_darwin 1
134*da0073e9SAndroid Build Coastguard Worker #elif (defined(__MINGW32__) && defined(__i386__)) \
135*da0073e9SAndroid Build Coastguard Worker || defined(__CYGWIN32__) \
136*da0073e9SAndroid Build Coastguard Worker || (defined(_WIN32) && defined(_M_IX86))
137*da0073e9SAndroid Build Coastguard Worker # define PLAT_x86_win32 1
138*da0073e9SAndroid Build Coastguard Worker #elif (defined(__MINGW32__) && defined(__x86_64__)) \
139*da0073e9SAndroid Build Coastguard Worker || (defined(_WIN32) && defined(_M_X64))
140*da0073e9SAndroid Build Coastguard Worker /* __MINGW32__ and _WIN32 are defined in 64 bit mode as well. */
141*da0073e9SAndroid Build Coastguard Worker # define PLAT_amd64_win64 1
142*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__i386__)
143*da0073e9SAndroid Build Coastguard Worker # define PLAT_x86_linux 1
144*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__x86_64__) && !defined(__ILP32__)
145*da0073e9SAndroid Build Coastguard Worker # define PLAT_amd64_linux 1
146*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
147*da0073e9SAndroid Build Coastguard Worker # define PLAT_ppc32_linux 1
148*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF != 2
149*da0073e9SAndroid Build Coastguard Worker /* Big Endian uses ELF version 1 */
150*da0073e9SAndroid Build Coastguard Worker # define PLAT_ppc64be_linux 1
151*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF == 2
152*da0073e9SAndroid Build Coastguard Worker /* Little Endian uses ELF version 2 */
153*da0073e9SAndroid Build Coastguard Worker # define PLAT_ppc64le_linux 1
154*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__arm__) && !defined(__aarch64__)
155*da0073e9SAndroid Build Coastguard Worker # define PLAT_arm_linux 1
156*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__aarch64__) && !defined(__arm__)
157*da0073e9SAndroid Build Coastguard Worker # define PLAT_arm64_linux 1
158*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__s390__) && defined(__s390x__)
159*da0073e9SAndroid Build Coastguard Worker # define PLAT_s390x_linux 1
160*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__mips__) && (__mips==64)
161*da0073e9SAndroid Build Coastguard Worker # define PLAT_mips64_linux 1
162*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__mips__) && (__mips==32)
163*da0073e9SAndroid Build Coastguard Worker # define PLAT_mips32_linux 1
164*da0073e9SAndroid Build Coastguard Worker #elif defined(__linux__) && defined(__nanomips__)
165*da0073e9SAndroid Build Coastguard Worker # define PLAT_nanomips_linux 1
166*da0073e9SAndroid Build Coastguard Worker #elif defined(__sun) && defined(__i386__)
167*da0073e9SAndroid Build Coastguard Worker # define PLAT_x86_solaris 1
168*da0073e9SAndroid Build Coastguard Worker #elif defined(__sun) && defined(__x86_64__)
169*da0073e9SAndroid Build Coastguard Worker # define PLAT_amd64_solaris 1
170*da0073e9SAndroid Build Coastguard Worker #else
171*da0073e9SAndroid Build Coastguard Worker /* If we're not compiling for our target platform, don't generate
172*da0073e9SAndroid Build Coastguard Worker any inline asms. */
173*da0073e9SAndroid Build Coastguard Worker # if !defined(NVALGRIND)
174*da0073e9SAndroid Build Coastguard Worker # define NVALGRIND 1
175*da0073e9SAndroid Build Coastguard Worker # endif
176*da0073e9SAndroid Build Coastguard Worker #endif
177*da0073e9SAndroid Build Coastguard Worker
178*da0073e9SAndroid Build Coastguard Worker
179*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
180*da0073e9SAndroid Build Coastguard Worker /* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS. There is nothing */
181*da0073e9SAndroid Build Coastguard Worker /* in here of use to end-users -- skip to the next section. */
182*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
183*da0073e9SAndroid Build Coastguard Worker
184*da0073e9SAndroid Build Coastguard Worker /*
185*da0073e9SAndroid Build Coastguard Worker * VALGRIND_DO_CLIENT_REQUEST(): a statement that invokes a Valgrind client
186*da0073e9SAndroid Build Coastguard Worker * request. Accepts both pointers and integers as arguments.
187*da0073e9SAndroid Build Coastguard Worker *
188*da0073e9SAndroid Build Coastguard Worker * VALGRIND_DO_CLIENT_REQUEST_STMT(): a statement that invokes a Valgrind
189*da0073e9SAndroid Build Coastguard Worker * client request that does not return a value.
190*da0073e9SAndroid Build Coastguard Worker
191*da0073e9SAndroid Build Coastguard Worker * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind
192*da0073e9SAndroid Build Coastguard Worker * client request and whose value equals the client request result. Accepts
193*da0073e9SAndroid Build Coastguard Worker * both pointers and integers as arguments. Note that such calls are not
194*da0073e9SAndroid Build Coastguard Worker * necessarily pure functions -- they may have side effects.
195*da0073e9SAndroid Build Coastguard Worker */
196*da0073e9SAndroid Build Coastguard Worker
197*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, \
198*da0073e9SAndroid Build Coastguard Worker _zzq_request, _zzq_arg1, _zzq_arg2, \
199*da0073e9SAndroid Build Coastguard Worker _zzq_arg3, _zzq_arg4, _zzq_arg5) \
200*da0073e9SAndroid Build Coastguard Worker do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default), \
201*da0073e9SAndroid Build Coastguard Worker (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
202*da0073e9SAndroid Build Coastguard Worker (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
203*da0073e9SAndroid Build Coastguard Worker
204*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1, \
205*da0073e9SAndroid Build Coastguard Worker _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
206*da0073e9SAndroid Build Coastguard Worker do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
207*da0073e9SAndroid Build Coastguard Worker (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
208*da0073e9SAndroid Build Coastguard Worker (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
209*da0073e9SAndroid Build Coastguard Worker
210*da0073e9SAndroid Build Coastguard Worker #if defined(NVALGRIND)
211*da0073e9SAndroid Build Coastguard Worker
212*da0073e9SAndroid Build Coastguard Worker /* Define NVALGRIND to completely remove the Valgrind magic sequence
213*da0073e9SAndroid Build Coastguard Worker from the compiled code (analogous to NDEBUG's effects on
214*da0073e9SAndroid Build Coastguard Worker assert()) */
215*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
216*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
217*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
218*da0073e9SAndroid Build Coastguard Worker (_zzq_default)
219*da0073e9SAndroid Build Coastguard Worker
220*da0073e9SAndroid Build Coastguard Worker #else /* ! NVALGRIND */
221*da0073e9SAndroid Build Coastguard Worker
222*da0073e9SAndroid Build Coastguard Worker /* The following defines the magic code sequences which the JITter
223*da0073e9SAndroid Build Coastguard Worker spots and handles magically. Don't look too closely at them as
224*da0073e9SAndroid Build Coastguard Worker they will rot your brain.
225*da0073e9SAndroid Build Coastguard Worker
226*da0073e9SAndroid Build Coastguard Worker The assembly code sequences for all architectures is in this one
227*da0073e9SAndroid Build Coastguard Worker file. This is because this file must be stand-alone, and we don't
228*da0073e9SAndroid Build Coastguard Worker want to have multiple files.
229*da0073e9SAndroid Build Coastguard Worker
230*da0073e9SAndroid Build Coastguard Worker For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default
231*da0073e9SAndroid Build Coastguard Worker value gets put in the return slot, so that everything works when
232*da0073e9SAndroid Build Coastguard Worker this is executed not under Valgrind. Args are passed in a memory
233*da0073e9SAndroid Build Coastguard Worker block, and so there's no intrinsic limit to the number that could
234*da0073e9SAndroid Build Coastguard Worker be passed, but it's currently five.
235*da0073e9SAndroid Build Coastguard Worker
236*da0073e9SAndroid Build Coastguard Worker The macro args are:
237*da0073e9SAndroid Build Coastguard Worker _zzq_rlval result lvalue
238*da0073e9SAndroid Build Coastguard Worker _zzq_default default value (result returned when running on real CPU)
239*da0073e9SAndroid Build Coastguard Worker _zzq_request request code
240*da0073e9SAndroid Build Coastguard Worker _zzq_arg1..5 request params
241*da0073e9SAndroid Build Coastguard Worker
242*da0073e9SAndroid Build Coastguard Worker The other two macros are used to support function wrapping, and are
243*da0073e9SAndroid Build Coastguard Worker a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the
244*da0073e9SAndroid Build Coastguard Worker guest's NRADDR pseudo-register and whatever other information is
245*da0073e9SAndroid Build Coastguard Worker needed to safely run the call original from the wrapper: on
246*da0073e9SAndroid Build Coastguard Worker ppc64-linux, the R2 value at the divert point is also needed. This
247*da0073e9SAndroid Build Coastguard Worker information is abstracted into a user-visible type, OrigFn.
248*da0073e9SAndroid Build Coastguard Worker
249*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_* behaves the same as the following on the
250*da0073e9SAndroid Build Coastguard Worker guest, but guarantees that the branch instruction will not be
251*da0073e9SAndroid Build Coastguard Worker redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64:
252*da0073e9SAndroid Build Coastguard Worker branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a
253*da0073e9SAndroid Build Coastguard Worker complete inline asm, since it needs to be combined with more magic
254*da0073e9SAndroid Build Coastguard Worker inline asm stuff to be useful.
255*da0073e9SAndroid Build Coastguard Worker */
256*da0073e9SAndroid Build Coastguard Worker
257*da0073e9SAndroid Build Coastguard Worker /* ----------------- x86-{linux,darwin,solaris} ---------------- */
258*da0073e9SAndroid Build Coastguard Worker
259*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \
260*da0073e9SAndroid Build Coastguard Worker || (defined(PLAT_x86_win32) && defined(__GNUC__)) \
261*da0073e9SAndroid Build Coastguard Worker || defined(PLAT_x86_solaris)
262*da0073e9SAndroid Build Coastguard Worker
263*da0073e9SAndroid Build Coastguard Worker typedef
264*da0073e9SAndroid Build Coastguard Worker struct {
265*da0073e9SAndroid Build Coastguard Worker unsigned int nraddr; /* where's the code? */
266*da0073e9SAndroid Build Coastguard Worker }
267*da0073e9SAndroid Build Coastguard Worker OrigFn;
268*da0073e9SAndroid Build Coastguard Worker
269*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
270*da0073e9SAndroid Build Coastguard Worker "roll $3, %%edi ; roll $13, %%edi\n\t" \
271*da0073e9SAndroid Build Coastguard Worker "roll $29, %%edi ; roll $19, %%edi\n\t"
272*da0073e9SAndroid Build Coastguard Worker
273*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
274*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
275*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
276*da0073e9SAndroid Build Coastguard Worker __extension__ \
277*da0073e9SAndroid Build Coastguard Worker ({volatile unsigned int _zzq_args[6]; \
278*da0073e9SAndroid Build Coastguard Worker volatile unsigned int _zzq_result; \
279*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned int)(_zzq_request); \
280*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned int)(_zzq_arg1); \
281*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned int)(_zzq_arg2); \
282*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned int)(_zzq_arg3); \
283*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned int)(_zzq_arg4); \
284*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned int)(_zzq_arg5); \
285*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
286*da0073e9SAndroid Build Coastguard Worker /* %EDX = client_request ( %EAX ) */ \
287*da0073e9SAndroid Build Coastguard Worker "xchgl %%ebx,%%ebx" \
288*da0073e9SAndroid Build Coastguard Worker : "=d" (_zzq_result) \
289*da0073e9SAndroid Build Coastguard Worker : "a" (&_zzq_args[0]), "0" (_zzq_default) \
290*da0073e9SAndroid Build Coastguard Worker : "cc", "memory" \
291*da0073e9SAndroid Build Coastguard Worker ); \
292*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
293*da0073e9SAndroid Build Coastguard Worker })
294*da0073e9SAndroid Build Coastguard Worker
295*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
296*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
297*da0073e9SAndroid Build Coastguard Worker volatile unsigned int __addr; \
298*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
299*da0073e9SAndroid Build Coastguard Worker /* %EAX = guest_NRADDR */ \
300*da0073e9SAndroid Build Coastguard Worker "xchgl %%ecx,%%ecx" \
301*da0073e9SAndroid Build Coastguard Worker : "=a" (__addr) \
302*da0073e9SAndroid Build Coastguard Worker : \
303*da0073e9SAndroid Build Coastguard Worker : "cc", "memory" \
304*da0073e9SAndroid Build Coastguard Worker ); \
305*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
306*da0073e9SAndroid Build Coastguard Worker }
307*da0073e9SAndroid Build Coastguard Worker
308*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_EAX \
309*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
310*da0073e9SAndroid Build Coastguard Worker /* call-noredir *%EAX */ \
311*da0073e9SAndroid Build Coastguard Worker "xchgl %%edx,%%edx\n\t"
312*da0073e9SAndroid Build Coastguard Worker
313*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
314*da0073e9SAndroid Build Coastguard Worker do { \
315*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
316*da0073e9SAndroid Build Coastguard Worker "xchgl %%edi,%%edi\n\t" \
317*da0073e9SAndroid Build Coastguard Worker : : : "cc", "memory" \
318*da0073e9SAndroid Build Coastguard Worker ); \
319*da0073e9SAndroid Build Coastguard Worker } while (0)
320*da0073e9SAndroid Build Coastguard Worker
321*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__)
322*da0073e9SAndroid Build Coastguard Worker || PLAT_x86_solaris */
323*da0073e9SAndroid Build Coastguard Worker
324*da0073e9SAndroid Build Coastguard Worker /* ------------------------- x86-Win32 ------------------------- */
325*da0073e9SAndroid Build Coastguard Worker
326*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_x86_win32) && !defined(__GNUC__)
327*da0073e9SAndroid Build Coastguard Worker
328*da0073e9SAndroid Build Coastguard Worker typedef
329*da0073e9SAndroid Build Coastguard Worker struct {
330*da0073e9SAndroid Build Coastguard Worker unsigned int nraddr; /* where's the code? */
331*da0073e9SAndroid Build Coastguard Worker }
332*da0073e9SAndroid Build Coastguard Worker OrigFn;
333*da0073e9SAndroid Build Coastguard Worker
334*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER)
335*da0073e9SAndroid Build Coastguard Worker
336*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
337*da0073e9SAndroid Build Coastguard Worker __asm rol edi, 3 __asm rol edi, 13 \
338*da0073e9SAndroid Build Coastguard Worker __asm rol edi, 29 __asm rol edi, 19
339*da0073e9SAndroid Build Coastguard Worker
340*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
341*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
342*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
343*da0073e9SAndroid Build Coastguard Worker valgrind_do_client_request_expr((uintptr_t)(_zzq_default), \
344*da0073e9SAndroid Build Coastguard Worker (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1), \
345*da0073e9SAndroid Build Coastguard Worker (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3), \
346*da0073e9SAndroid Build Coastguard Worker (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5))
347*da0073e9SAndroid Build Coastguard Worker
348*da0073e9SAndroid Build Coastguard Worker static __inline uintptr_t
valgrind_do_client_request_expr(uintptr_t _zzq_default,uintptr_t _zzq_request,uintptr_t _zzq_arg1,uintptr_t _zzq_arg2,uintptr_t _zzq_arg3,uintptr_t _zzq_arg4,uintptr_t _zzq_arg5)349*da0073e9SAndroid Build Coastguard Worker valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request,
350*da0073e9SAndroid Build Coastguard Worker uintptr_t _zzq_arg1, uintptr_t _zzq_arg2,
351*da0073e9SAndroid Build Coastguard Worker uintptr_t _zzq_arg3, uintptr_t _zzq_arg4,
352*da0073e9SAndroid Build Coastguard Worker uintptr_t _zzq_arg5)
353*da0073e9SAndroid Build Coastguard Worker {
354*da0073e9SAndroid Build Coastguard Worker volatile uintptr_t _zzq_args[6];
355*da0073e9SAndroid Build Coastguard Worker volatile unsigned int _zzq_result;
356*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (uintptr_t)(_zzq_request);
357*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (uintptr_t)(_zzq_arg1);
358*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (uintptr_t)(_zzq_arg2);
359*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (uintptr_t)(_zzq_arg3);
360*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (uintptr_t)(_zzq_arg4);
361*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (uintptr_t)(_zzq_arg5);
362*da0073e9SAndroid Build Coastguard Worker __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default
363*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE
364*da0073e9SAndroid Build Coastguard Worker /* %EDX = client_request ( %EAX ) */
365*da0073e9SAndroid Build Coastguard Worker __asm xchg ebx,ebx
366*da0073e9SAndroid Build Coastguard Worker __asm mov _zzq_result, edx
367*da0073e9SAndroid Build Coastguard Worker }
368*da0073e9SAndroid Build Coastguard Worker return _zzq_result;
369*da0073e9SAndroid Build Coastguard Worker }
370*da0073e9SAndroid Build Coastguard Worker
371*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
372*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
373*da0073e9SAndroid Build Coastguard Worker volatile unsigned int __addr; \
374*da0073e9SAndroid Build Coastguard Worker __asm { __SPECIAL_INSTRUCTION_PREAMBLE \
375*da0073e9SAndroid Build Coastguard Worker /* %EAX = guest_NRADDR */ \
376*da0073e9SAndroid Build Coastguard Worker __asm xchg ecx,ecx \
377*da0073e9SAndroid Build Coastguard Worker __asm mov __addr, eax \
378*da0073e9SAndroid Build Coastguard Worker } \
379*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
380*da0073e9SAndroid Build Coastguard Worker }
381*da0073e9SAndroid Build Coastguard Worker
382*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_EAX ERROR
383*da0073e9SAndroid Build Coastguard Worker
384*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
385*da0073e9SAndroid Build Coastguard Worker do { \
386*da0073e9SAndroid Build Coastguard Worker __asm { __SPECIAL_INSTRUCTION_PREAMBLE \
387*da0073e9SAndroid Build Coastguard Worker __asm xchg edi,edi \
388*da0073e9SAndroid Build Coastguard Worker } \
389*da0073e9SAndroid Build Coastguard Worker } while (0)
390*da0073e9SAndroid Build Coastguard Worker
391*da0073e9SAndroid Build Coastguard Worker #else
392*da0073e9SAndroid Build Coastguard Worker #error Unsupported compiler.
393*da0073e9SAndroid Build Coastguard Worker #endif
394*da0073e9SAndroid Build Coastguard Worker
395*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_x86_win32 */
396*da0073e9SAndroid Build Coastguard Worker
397*da0073e9SAndroid Build Coastguard Worker /* ----------------- amd64-{linux,darwin,solaris} --------------- */
398*da0073e9SAndroid Build Coastguard Worker
399*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) \
400*da0073e9SAndroid Build Coastguard Worker || defined(PLAT_amd64_solaris) \
401*da0073e9SAndroid Build Coastguard Worker || (defined(PLAT_amd64_win64) && defined(__GNUC__))
402*da0073e9SAndroid Build Coastguard Worker
403*da0073e9SAndroid Build Coastguard Worker typedef
404*da0073e9SAndroid Build Coastguard Worker struct {
405*da0073e9SAndroid Build Coastguard Worker unsigned long int nraddr; /* where's the code? */
406*da0073e9SAndroid Build Coastguard Worker }
407*da0073e9SAndroid Build Coastguard Worker OrigFn;
408*da0073e9SAndroid Build Coastguard Worker
409*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
410*da0073e9SAndroid Build Coastguard Worker "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
411*da0073e9SAndroid Build Coastguard Worker "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
412*da0073e9SAndroid Build Coastguard Worker
413*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
414*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
415*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
416*da0073e9SAndroid Build Coastguard Worker __extension__ \
417*da0073e9SAndroid Build Coastguard Worker ({ volatile unsigned long int _zzq_args[6]; \
418*da0073e9SAndroid Build Coastguard Worker volatile unsigned long int _zzq_result; \
419*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned long int)(_zzq_request); \
420*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned long int)(_zzq_arg1); \
421*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned long int)(_zzq_arg2); \
422*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned long int)(_zzq_arg3); \
423*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned long int)(_zzq_arg4); \
424*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned long int)(_zzq_arg5); \
425*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
426*da0073e9SAndroid Build Coastguard Worker /* %RDX = client_request ( %RAX ) */ \
427*da0073e9SAndroid Build Coastguard Worker "xchgq %%rbx,%%rbx" \
428*da0073e9SAndroid Build Coastguard Worker : "=d" (_zzq_result) \
429*da0073e9SAndroid Build Coastguard Worker : "a" (&_zzq_args[0]), "0" (_zzq_default) \
430*da0073e9SAndroid Build Coastguard Worker : "cc", "memory" \
431*da0073e9SAndroid Build Coastguard Worker ); \
432*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
433*da0073e9SAndroid Build Coastguard Worker })
434*da0073e9SAndroid Build Coastguard Worker
435*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
436*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
437*da0073e9SAndroid Build Coastguard Worker volatile unsigned long int __addr; \
438*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
439*da0073e9SAndroid Build Coastguard Worker /* %RAX = guest_NRADDR */ \
440*da0073e9SAndroid Build Coastguard Worker "xchgq %%rcx,%%rcx" \
441*da0073e9SAndroid Build Coastguard Worker : "=a" (__addr) \
442*da0073e9SAndroid Build Coastguard Worker : \
443*da0073e9SAndroid Build Coastguard Worker : "cc", "memory" \
444*da0073e9SAndroid Build Coastguard Worker ); \
445*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
446*da0073e9SAndroid Build Coastguard Worker }
447*da0073e9SAndroid Build Coastguard Worker
448*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_RAX \
449*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
450*da0073e9SAndroid Build Coastguard Worker /* call-noredir *%RAX */ \
451*da0073e9SAndroid Build Coastguard Worker "xchgq %%rdx,%%rdx\n\t"
452*da0073e9SAndroid Build Coastguard Worker
453*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
454*da0073e9SAndroid Build Coastguard Worker do { \
455*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
456*da0073e9SAndroid Build Coastguard Worker "xchgq %%rdi,%%rdi\n\t" \
457*da0073e9SAndroid Build Coastguard Worker : : : "cc", "memory" \
458*da0073e9SAndroid Build Coastguard Worker ); \
459*da0073e9SAndroid Build Coastguard Worker } while (0)
460*da0073e9SAndroid Build Coastguard Worker
461*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_amd64_linux || PLAT_amd64_darwin || PLAT_amd64_solaris */
462*da0073e9SAndroid Build Coastguard Worker
463*da0073e9SAndroid Build Coastguard Worker /* ------------------------- amd64-Win64 ------------------------- */
464*da0073e9SAndroid Build Coastguard Worker
465*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_amd64_win64) && !defined(__GNUC__)
466*da0073e9SAndroid Build Coastguard Worker
467*da0073e9SAndroid Build Coastguard Worker #error Unsupported compiler.
468*da0073e9SAndroid Build Coastguard Worker
469*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_amd64_win64 */
470*da0073e9SAndroid Build Coastguard Worker
471*da0073e9SAndroid Build Coastguard Worker /* ------------------------ ppc32-linux ------------------------ */
472*da0073e9SAndroid Build Coastguard Worker
473*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc32_linux)
474*da0073e9SAndroid Build Coastguard Worker
475*da0073e9SAndroid Build Coastguard Worker typedef
476*da0073e9SAndroid Build Coastguard Worker struct {
477*da0073e9SAndroid Build Coastguard Worker unsigned int nraddr; /* where's the code? */
478*da0073e9SAndroid Build Coastguard Worker }
479*da0073e9SAndroid Build Coastguard Worker OrigFn;
480*da0073e9SAndroid Build Coastguard Worker
481*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
482*da0073e9SAndroid Build Coastguard Worker "rlwinm 0,0,3,0,31 ; rlwinm 0,0,13,0,31\n\t" \
483*da0073e9SAndroid Build Coastguard Worker "rlwinm 0,0,29,0,31 ; rlwinm 0,0,19,0,31\n\t"
484*da0073e9SAndroid Build Coastguard Worker
485*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
486*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
487*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
488*da0073e9SAndroid Build Coastguard Worker \
489*da0073e9SAndroid Build Coastguard Worker __extension__ \
490*da0073e9SAndroid Build Coastguard Worker ({ unsigned int _zzq_args[6]; \
491*da0073e9SAndroid Build Coastguard Worker unsigned int _zzq_result; \
492*da0073e9SAndroid Build Coastguard Worker unsigned int* _zzq_ptr; \
493*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned int)(_zzq_request); \
494*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned int)(_zzq_arg1); \
495*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned int)(_zzq_arg2); \
496*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned int)(_zzq_arg3); \
497*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned int)(_zzq_arg4); \
498*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned int)(_zzq_arg5); \
499*da0073e9SAndroid Build Coastguard Worker _zzq_ptr = _zzq_args; \
500*da0073e9SAndroid Build Coastguard Worker __asm__ volatile("mr 3,%1\n\t" /*default*/ \
501*da0073e9SAndroid Build Coastguard Worker "mr 4,%2\n\t" /*ptr*/ \
502*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
503*da0073e9SAndroid Build Coastguard Worker /* %R3 = client_request ( %R4 ) */ \
504*da0073e9SAndroid Build Coastguard Worker "or 1,1,1\n\t" \
505*da0073e9SAndroid Build Coastguard Worker "mr %0,3" /*result*/ \
506*da0073e9SAndroid Build Coastguard Worker : "=b" (_zzq_result) \
507*da0073e9SAndroid Build Coastguard Worker : "b" (_zzq_default), "b" (_zzq_ptr) \
508*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "r3", "r4"); \
509*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
510*da0073e9SAndroid Build Coastguard Worker })
511*da0073e9SAndroid Build Coastguard Worker
512*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
513*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
514*da0073e9SAndroid Build Coastguard Worker unsigned int __addr; \
515*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
516*da0073e9SAndroid Build Coastguard Worker /* %R3 = guest_NRADDR */ \
517*da0073e9SAndroid Build Coastguard Worker "or 2,2,2\n\t" \
518*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
519*da0073e9SAndroid Build Coastguard Worker : "=b" (__addr) \
520*da0073e9SAndroid Build Coastguard Worker : \
521*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "r3" \
522*da0073e9SAndroid Build Coastguard Worker ); \
523*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
524*da0073e9SAndroid Build Coastguard Worker }
525*da0073e9SAndroid Build Coastguard Worker
526*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
527*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
528*da0073e9SAndroid Build Coastguard Worker /* branch-and-link-to-noredir *%R11 */ \
529*da0073e9SAndroid Build Coastguard Worker "or 3,3,3\n\t"
530*da0073e9SAndroid Build Coastguard Worker
531*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
532*da0073e9SAndroid Build Coastguard Worker do { \
533*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
534*da0073e9SAndroid Build Coastguard Worker "or 5,5,5\n\t" \
535*da0073e9SAndroid Build Coastguard Worker ); \
536*da0073e9SAndroid Build Coastguard Worker } while (0)
537*da0073e9SAndroid Build Coastguard Worker
538*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc32_linux */
539*da0073e9SAndroid Build Coastguard Worker
540*da0073e9SAndroid Build Coastguard Worker /* ------------------------ ppc64-linux ------------------------ */
541*da0073e9SAndroid Build Coastguard Worker
542*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc64be_linux)
543*da0073e9SAndroid Build Coastguard Worker
544*da0073e9SAndroid Build Coastguard Worker typedef
545*da0073e9SAndroid Build Coastguard Worker struct {
546*da0073e9SAndroid Build Coastguard Worker unsigned long int nraddr; /* where's the code? */
547*da0073e9SAndroid Build Coastguard Worker unsigned long int r2; /* what tocptr do we need? */
548*da0073e9SAndroid Build Coastguard Worker }
549*da0073e9SAndroid Build Coastguard Worker OrigFn;
550*da0073e9SAndroid Build Coastguard Worker
551*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
552*da0073e9SAndroid Build Coastguard Worker "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
553*da0073e9SAndroid Build Coastguard Worker "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
554*da0073e9SAndroid Build Coastguard Worker
555*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
556*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
557*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
558*da0073e9SAndroid Build Coastguard Worker \
559*da0073e9SAndroid Build Coastguard Worker __extension__ \
560*da0073e9SAndroid Build Coastguard Worker ({ unsigned long int _zzq_args[6]; \
561*da0073e9SAndroid Build Coastguard Worker unsigned long int _zzq_result; \
562*da0073e9SAndroid Build Coastguard Worker unsigned long int* _zzq_ptr; \
563*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned long int)(_zzq_request); \
564*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned long int)(_zzq_arg1); \
565*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned long int)(_zzq_arg2); \
566*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned long int)(_zzq_arg3); \
567*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned long int)(_zzq_arg4); \
568*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned long int)(_zzq_arg5); \
569*da0073e9SAndroid Build Coastguard Worker _zzq_ptr = _zzq_args; \
570*da0073e9SAndroid Build Coastguard Worker __asm__ volatile("mr 3,%1\n\t" /*default*/ \
571*da0073e9SAndroid Build Coastguard Worker "mr 4,%2\n\t" /*ptr*/ \
572*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
573*da0073e9SAndroid Build Coastguard Worker /* %R3 = client_request ( %R4 ) */ \
574*da0073e9SAndroid Build Coastguard Worker "or 1,1,1\n\t" \
575*da0073e9SAndroid Build Coastguard Worker "mr %0,3" /*result*/ \
576*da0073e9SAndroid Build Coastguard Worker : "=b" (_zzq_result) \
577*da0073e9SAndroid Build Coastguard Worker : "b" (_zzq_default), "b" (_zzq_ptr) \
578*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "r3", "r4"); \
579*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
580*da0073e9SAndroid Build Coastguard Worker })
581*da0073e9SAndroid Build Coastguard Worker
582*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
583*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
584*da0073e9SAndroid Build Coastguard Worker unsigned long int __addr; \
585*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
586*da0073e9SAndroid Build Coastguard Worker /* %R3 = guest_NRADDR */ \
587*da0073e9SAndroid Build Coastguard Worker "or 2,2,2\n\t" \
588*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
589*da0073e9SAndroid Build Coastguard Worker : "=b" (__addr) \
590*da0073e9SAndroid Build Coastguard Worker : \
591*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "r3" \
592*da0073e9SAndroid Build Coastguard Worker ); \
593*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
594*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
595*da0073e9SAndroid Build Coastguard Worker /* %R3 = guest_NRADDR_GPR2 */ \
596*da0073e9SAndroid Build Coastguard Worker "or 4,4,4\n\t" \
597*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
598*da0073e9SAndroid Build Coastguard Worker : "=b" (__addr) \
599*da0073e9SAndroid Build Coastguard Worker : \
600*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "r3" \
601*da0073e9SAndroid Build Coastguard Worker ); \
602*da0073e9SAndroid Build Coastguard Worker _zzq_orig->r2 = __addr; \
603*da0073e9SAndroid Build Coastguard Worker }
604*da0073e9SAndroid Build Coastguard Worker
605*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
606*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
607*da0073e9SAndroid Build Coastguard Worker /* branch-and-link-to-noredir *%R11 */ \
608*da0073e9SAndroid Build Coastguard Worker "or 3,3,3\n\t"
609*da0073e9SAndroid Build Coastguard Worker
610*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
611*da0073e9SAndroid Build Coastguard Worker do { \
612*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
613*da0073e9SAndroid Build Coastguard Worker "or 5,5,5\n\t" \
614*da0073e9SAndroid Build Coastguard Worker ); \
615*da0073e9SAndroid Build Coastguard Worker } while (0)
616*da0073e9SAndroid Build Coastguard Worker
617*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc64be_linux */
618*da0073e9SAndroid Build Coastguard Worker
619*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc64le_linux)
620*da0073e9SAndroid Build Coastguard Worker
621*da0073e9SAndroid Build Coastguard Worker typedef
622*da0073e9SAndroid Build Coastguard Worker struct {
623*da0073e9SAndroid Build Coastguard Worker unsigned long int nraddr; /* where's the code? */
624*da0073e9SAndroid Build Coastguard Worker unsigned long int r2; /* what tocptr do we need? */
625*da0073e9SAndroid Build Coastguard Worker }
626*da0073e9SAndroid Build Coastguard Worker OrigFn;
627*da0073e9SAndroid Build Coastguard Worker
628*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
629*da0073e9SAndroid Build Coastguard Worker "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
630*da0073e9SAndroid Build Coastguard Worker "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
631*da0073e9SAndroid Build Coastguard Worker
632*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
633*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
634*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
635*da0073e9SAndroid Build Coastguard Worker \
636*da0073e9SAndroid Build Coastguard Worker __extension__ \
637*da0073e9SAndroid Build Coastguard Worker ({ unsigned long int _zzq_args[6]; \
638*da0073e9SAndroid Build Coastguard Worker unsigned long int _zzq_result; \
639*da0073e9SAndroid Build Coastguard Worker unsigned long int* _zzq_ptr; \
640*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned long int)(_zzq_request); \
641*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned long int)(_zzq_arg1); \
642*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned long int)(_zzq_arg2); \
643*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned long int)(_zzq_arg3); \
644*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned long int)(_zzq_arg4); \
645*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned long int)(_zzq_arg5); \
646*da0073e9SAndroid Build Coastguard Worker _zzq_ptr = _zzq_args; \
647*da0073e9SAndroid Build Coastguard Worker __asm__ volatile("mr 3,%1\n\t" /*default*/ \
648*da0073e9SAndroid Build Coastguard Worker "mr 4,%2\n\t" /*ptr*/ \
649*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
650*da0073e9SAndroid Build Coastguard Worker /* %R3 = client_request ( %R4 ) */ \
651*da0073e9SAndroid Build Coastguard Worker "or 1,1,1\n\t" \
652*da0073e9SAndroid Build Coastguard Worker "mr %0,3" /*result*/ \
653*da0073e9SAndroid Build Coastguard Worker : "=b" (_zzq_result) \
654*da0073e9SAndroid Build Coastguard Worker : "b" (_zzq_default), "b" (_zzq_ptr) \
655*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "r3", "r4"); \
656*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
657*da0073e9SAndroid Build Coastguard Worker })
658*da0073e9SAndroid Build Coastguard Worker
659*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
660*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
661*da0073e9SAndroid Build Coastguard Worker unsigned long int __addr; \
662*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
663*da0073e9SAndroid Build Coastguard Worker /* %R3 = guest_NRADDR */ \
664*da0073e9SAndroid Build Coastguard Worker "or 2,2,2\n\t" \
665*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
666*da0073e9SAndroid Build Coastguard Worker : "=b" (__addr) \
667*da0073e9SAndroid Build Coastguard Worker : \
668*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "r3" \
669*da0073e9SAndroid Build Coastguard Worker ); \
670*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
671*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
672*da0073e9SAndroid Build Coastguard Worker /* %R3 = guest_NRADDR_GPR2 */ \
673*da0073e9SAndroid Build Coastguard Worker "or 4,4,4\n\t" \
674*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
675*da0073e9SAndroid Build Coastguard Worker : "=b" (__addr) \
676*da0073e9SAndroid Build Coastguard Worker : \
677*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "r3" \
678*da0073e9SAndroid Build Coastguard Worker ); \
679*da0073e9SAndroid Build Coastguard Worker _zzq_orig->r2 = __addr; \
680*da0073e9SAndroid Build Coastguard Worker }
681*da0073e9SAndroid Build Coastguard Worker
682*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
683*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
684*da0073e9SAndroid Build Coastguard Worker /* branch-and-link-to-noredir *%R12 */ \
685*da0073e9SAndroid Build Coastguard Worker "or 3,3,3\n\t"
686*da0073e9SAndroid Build Coastguard Worker
687*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
688*da0073e9SAndroid Build Coastguard Worker do { \
689*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
690*da0073e9SAndroid Build Coastguard Worker "or 5,5,5\n\t" \
691*da0073e9SAndroid Build Coastguard Worker ); \
692*da0073e9SAndroid Build Coastguard Worker } while (0)
693*da0073e9SAndroid Build Coastguard Worker
694*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc64le_linux */
695*da0073e9SAndroid Build Coastguard Worker
696*da0073e9SAndroid Build Coastguard Worker /* ------------------------- arm-linux ------------------------- */
697*da0073e9SAndroid Build Coastguard Worker
698*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_arm_linux)
699*da0073e9SAndroid Build Coastguard Worker
700*da0073e9SAndroid Build Coastguard Worker typedef
701*da0073e9SAndroid Build Coastguard Worker struct {
702*da0073e9SAndroid Build Coastguard Worker unsigned int nraddr; /* where's the code? */
703*da0073e9SAndroid Build Coastguard Worker }
704*da0073e9SAndroid Build Coastguard Worker OrigFn;
705*da0073e9SAndroid Build Coastguard Worker
706*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
707*da0073e9SAndroid Build Coastguard Worker "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \
708*da0073e9SAndroid Build Coastguard Worker "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
709*da0073e9SAndroid Build Coastguard Worker
710*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
711*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
712*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
713*da0073e9SAndroid Build Coastguard Worker \
714*da0073e9SAndroid Build Coastguard Worker __extension__ \
715*da0073e9SAndroid Build Coastguard Worker ({volatile unsigned int _zzq_args[6]; \
716*da0073e9SAndroid Build Coastguard Worker volatile unsigned int _zzq_result; \
717*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned int)(_zzq_request); \
718*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned int)(_zzq_arg1); \
719*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned int)(_zzq_arg2); \
720*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned int)(_zzq_arg3); \
721*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned int)(_zzq_arg4); \
722*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned int)(_zzq_arg5); \
723*da0073e9SAndroid Build Coastguard Worker __asm__ volatile("mov r3, %1\n\t" /*default*/ \
724*da0073e9SAndroid Build Coastguard Worker "mov r4, %2\n\t" /*ptr*/ \
725*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
726*da0073e9SAndroid Build Coastguard Worker /* R3 = client_request ( R4 ) */ \
727*da0073e9SAndroid Build Coastguard Worker "orr r10, r10, r10\n\t" \
728*da0073e9SAndroid Build Coastguard Worker "mov %0, r3" /*result*/ \
729*da0073e9SAndroid Build Coastguard Worker : "=r" (_zzq_result) \
730*da0073e9SAndroid Build Coastguard Worker : "r" (_zzq_default), "r" (&_zzq_args[0]) \
731*da0073e9SAndroid Build Coastguard Worker : "cc","memory", "r3", "r4"); \
732*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
733*da0073e9SAndroid Build Coastguard Worker })
734*da0073e9SAndroid Build Coastguard Worker
735*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
736*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
737*da0073e9SAndroid Build Coastguard Worker unsigned int __addr; \
738*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
739*da0073e9SAndroid Build Coastguard Worker /* R3 = guest_NRADDR */ \
740*da0073e9SAndroid Build Coastguard Worker "orr r11, r11, r11\n\t" \
741*da0073e9SAndroid Build Coastguard Worker "mov %0, r3" \
742*da0073e9SAndroid Build Coastguard Worker : "=r" (__addr) \
743*da0073e9SAndroid Build Coastguard Worker : \
744*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "r3" \
745*da0073e9SAndroid Build Coastguard Worker ); \
746*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
747*da0073e9SAndroid Build Coastguard Worker }
748*da0073e9SAndroid Build Coastguard Worker
749*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
750*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
751*da0073e9SAndroid Build Coastguard Worker /* branch-and-link-to-noredir *%R4 */ \
752*da0073e9SAndroid Build Coastguard Worker "orr r12, r12, r12\n\t"
753*da0073e9SAndroid Build Coastguard Worker
754*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
755*da0073e9SAndroid Build Coastguard Worker do { \
756*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
757*da0073e9SAndroid Build Coastguard Worker "orr r9, r9, r9\n\t" \
758*da0073e9SAndroid Build Coastguard Worker : : : "cc", "memory" \
759*da0073e9SAndroid Build Coastguard Worker ); \
760*da0073e9SAndroid Build Coastguard Worker } while (0)
761*da0073e9SAndroid Build Coastguard Worker
762*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_arm_linux */
763*da0073e9SAndroid Build Coastguard Worker
764*da0073e9SAndroid Build Coastguard Worker /* ------------------------ arm64-linux ------------------------- */
765*da0073e9SAndroid Build Coastguard Worker
766*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_arm64_linux)
767*da0073e9SAndroid Build Coastguard Worker
768*da0073e9SAndroid Build Coastguard Worker typedef
769*da0073e9SAndroid Build Coastguard Worker struct {
770*da0073e9SAndroid Build Coastguard Worker unsigned long int nraddr; /* where's the code? */
771*da0073e9SAndroid Build Coastguard Worker }
772*da0073e9SAndroid Build Coastguard Worker OrigFn;
773*da0073e9SAndroid Build Coastguard Worker
774*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
775*da0073e9SAndroid Build Coastguard Worker "ror x12, x12, #3 ; ror x12, x12, #13 \n\t" \
776*da0073e9SAndroid Build Coastguard Worker "ror x12, x12, #51 ; ror x12, x12, #61 \n\t"
777*da0073e9SAndroid Build Coastguard Worker
778*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
779*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
780*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
781*da0073e9SAndroid Build Coastguard Worker \
782*da0073e9SAndroid Build Coastguard Worker __extension__ \
783*da0073e9SAndroid Build Coastguard Worker ({volatile unsigned long int _zzq_args[6]; \
784*da0073e9SAndroid Build Coastguard Worker volatile unsigned long int _zzq_result; \
785*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned long int)(_zzq_request); \
786*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned long int)(_zzq_arg1); \
787*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned long int)(_zzq_arg2); \
788*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned long int)(_zzq_arg3); \
789*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned long int)(_zzq_arg4); \
790*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned long int)(_zzq_arg5); \
791*da0073e9SAndroid Build Coastguard Worker __asm__ volatile("mov x3, %1\n\t" /*default*/ \
792*da0073e9SAndroid Build Coastguard Worker "mov x4, %2\n\t" /*ptr*/ \
793*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
794*da0073e9SAndroid Build Coastguard Worker /* X3 = client_request ( X4 ) */ \
795*da0073e9SAndroid Build Coastguard Worker "orr x10, x10, x10\n\t" \
796*da0073e9SAndroid Build Coastguard Worker "mov %0, x3" /*result*/ \
797*da0073e9SAndroid Build Coastguard Worker : "=r" (_zzq_result) \
798*da0073e9SAndroid Build Coastguard Worker : "r" ((unsigned long int)(_zzq_default)), \
799*da0073e9SAndroid Build Coastguard Worker "r" (&_zzq_args[0]) \
800*da0073e9SAndroid Build Coastguard Worker : "cc","memory", "x3", "x4"); \
801*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
802*da0073e9SAndroid Build Coastguard Worker })
803*da0073e9SAndroid Build Coastguard Worker
804*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
805*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
806*da0073e9SAndroid Build Coastguard Worker unsigned long int __addr; \
807*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
808*da0073e9SAndroid Build Coastguard Worker /* X3 = guest_NRADDR */ \
809*da0073e9SAndroid Build Coastguard Worker "orr x11, x11, x11\n\t" \
810*da0073e9SAndroid Build Coastguard Worker "mov %0, x3" \
811*da0073e9SAndroid Build Coastguard Worker : "=r" (__addr) \
812*da0073e9SAndroid Build Coastguard Worker : \
813*da0073e9SAndroid Build Coastguard Worker : "cc", "memory", "x3" \
814*da0073e9SAndroid Build Coastguard Worker ); \
815*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
816*da0073e9SAndroid Build Coastguard Worker }
817*da0073e9SAndroid Build Coastguard Worker
818*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
819*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
820*da0073e9SAndroid Build Coastguard Worker /* branch-and-link-to-noredir X8 */ \
821*da0073e9SAndroid Build Coastguard Worker "orr x12, x12, x12\n\t"
822*da0073e9SAndroid Build Coastguard Worker
823*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
824*da0073e9SAndroid Build Coastguard Worker do { \
825*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
826*da0073e9SAndroid Build Coastguard Worker "orr x9, x9, x9\n\t" \
827*da0073e9SAndroid Build Coastguard Worker : : : "cc", "memory" \
828*da0073e9SAndroid Build Coastguard Worker ); \
829*da0073e9SAndroid Build Coastguard Worker } while (0)
830*da0073e9SAndroid Build Coastguard Worker
831*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_arm64_linux */
832*da0073e9SAndroid Build Coastguard Worker
833*da0073e9SAndroid Build Coastguard Worker /* ------------------------ s390x-linux ------------------------ */
834*da0073e9SAndroid Build Coastguard Worker
835*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_s390x_linux)
836*da0073e9SAndroid Build Coastguard Worker
837*da0073e9SAndroid Build Coastguard Worker typedef
838*da0073e9SAndroid Build Coastguard Worker struct {
839*da0073e9SAndroid Build Coastguard Worker unsigned long int nraddr; /* where's the code? */
840*da0073e9SAndroid Build Coastguard Worker }
841*da0073e9SAndroid Build Coastguard Worker OrigFn;
842*da0073e9SAndroid Build Coastguard Worker
843*da0073e9SAndroid Build Coastguard Worker /* __SPECIAL_INSTRUCTION_PREAMBLE will be used to identify Valgrind specific
844*da0073e9SAndroid Build Coastguard Worker * code. This detection is implemented in platform specific toIR.c
845*da0073e9SAndroid Build Coastguard Worker * (e.g. VEX/priv/guest_s390_decoder.c).
846*da0073e9SAndroid Build Coastguard Worker */
847*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
848*da0073e9SAndroid Build Coastguard Worker "lr 15,15\n\t" \
849*da0073e9SAndroid Build Coastguard Worker "lr 1,1\n\t" \
850*da0073e9SAndroid Build Coastguard Worker "lr 2,2\n\t" \
851*da0073e9SAndroid Build Coastguard Worker "lr 3,3\n\t"
852*da0073e9SAndroid Build Coastguard Worker
853*da0073e9SAndroid Build Coastguard Worker #define __CLIENT_REQUEST_CODE "lr 2,2\n\t"
854*da0073e9SAndroid Build Coastguard Worker #define __GET_NR_CONTEXT_CODE "lr 3,3\n\t"
855*da0073e9SAndroid Build Coastguard Worker #define __CALL_NO_REDIR_CODE "lr 4,4\n\t"
856*da0073e9SAndroid Build Coastguard Worker #define __VEX_INJECT_IR_CODE "lr 5,5\n\t"
857*da0073e9SAndroid Build Coastguard Worker
858*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
859*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
860*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
861*da0073e9SAndroid Build Coastguard Worker __extension__ \
862*da0073e9SAndroid Build Coastguard Worker ({volatile unsigned long int _zzq_args[6]; \
863*da0073e9SAndroid Build Coastguard Worker volatile unsigned long int _zzq_result; \
864*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned long int)(_zzq_request); \
865*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned long int)(_zzq_arg1); \
866*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned long int)(_zzq_arg2); \
867*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned long int)(_zzq_arg3); \
868*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned long int)(_zzq_arg4); \
869*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned long int)(_zzq_arg5); \
870*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(/* r2 = args */ \
871*da0073e9SAndroid Build Coastguard Worker "lgr 2,%1\n\t" \
872*da0073e9SAndroid Build Coastguard Worker /* r3 = default */ \
873*da0073e9SAndroid Build Coastguard Worker "lgr 3,%2\n\t" \
874*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
875*da0073e9SAndroid Build Coastguard Worker __CLIENT_REQUEST_CODE \
876*da0073e9SAndroid Build Coastguard Worker /* results = r3 */ \
877*da0073e9SAndroid Build Coastguard Worker "lgr %0, 3\n\t" \
878*da0073e9SAndroid Build Coastguard Worker : "=d" (_zzq_result) \
879*da0073e9SAndroid Build Coastguard Worker : "a" (&_zzq_args[0]), "0" (_zzq_default) \
880*da0073e9SAndroid Build Coastguard Worker : "cc", "2", "3", "memory" \
881*da0073e9SAndroid Build Coastguard Worker ); \
882*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
883*da0073e9SAndroid Build Coastguard Worker })
884*da0073e9SAndroid Build Coastguard Worker
885*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
886*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
887*da0073e9SAndroid Build Coastguard Worker volatile unsigned long int __addr; \
888*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
889*da0073e9SAndroid Build Coastguard Worker __GET_NR_CONTEXT_CODE \
890*da0073e9SAndroid Build Coastguard Worker "lgr %0, 3\n\t" \
891*da0073e9SAndroid Build Coastguard Worker : "=a" (__addr) \
892*da0073e9SAndroid Build Coastguard Worker : \
893*da0073e9SAndroid Build Coastguard Worker : "cc", "3", "memory" \
894*da0073e9SAndroid Build Coastguard Worker ); \
895*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
896*da0073e9SAndroid Build Coastguard Worker }
897*da0073e9SAndroid Build Coastguard Worker
898*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_R1 \
899*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
900*da0073e9SAndroid Build Coastguard Worker __CALL_NO_REDIR_CODE
901*da0073e9SAndroid Build Coastguard Worker
902*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
903*da0073e9SAndroid Build Coastguard Worker do { \
904*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
905*da0073e9SAndroid Build Coastguard Worker __VEX_INJECT_IR_CODE); \
906*da0073e9SAndroid Build Coastguard Worker } while (0)
907*da0073e9SAndroid Build Coastguard Worker
908*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_s390x_linux */
909*da0073e9SAndroid Build Coastguard Worker
910*da0073e9SAndroid Build Coastguard Worker /* ------------------------- mips32-linux ---------------- */
911*da0073e9SAndroid Build Coastguard Worker
912*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_mips32_linux)
913*da0073e9SAndroid Build Coastguard Worker
914*da0073e9SAndroid Build Coastguard Worker typedef
915*da0073e9SAndroid Build Coastguard Worker struct {
916*da0073e9SAndroid Build Coastguard Worker unsigned int nraddr; /* where's the code? */
917*da0073e9SAndroid Build Coastguard Worker }
918*da0073e9SAndroid Build Coastguard Worker OrigFn;
919*da0073e9SAndroid Build Coastguard Worker
920*da0073e9SAndroid Build Coastguard Worker /* .word 0x342
921*da0073e9SAndroid Build Coastguard Worker * .word 0x742
922*da0073e9SAndroid Build Coastguard Worker * .word 0xC2
923*da0073e9SAndroid Build Coastguard Worker * .word 0x4C2*/
924*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
925*da0073e9SAndroid Build Coastguard Worker "srl $0, $0, 13\n\t" \
926*da0073e9SAndroid Build Coastguard Worker "srl $0, $0, 29\n\t" \
927*da0073e9SAndroid Build Coastguard Worker "srl $0, $0, 3\n\t" \
928*da0073e9SAndroid Build Coastguard Worker "srl $0, $0, 19\n\t"
929*da0073e9SAndroid Build Coastguard Worker
930*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
931*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
932*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
933*da0073e9SAndroid Build Coastguard Worker __extension__ \
934*da0073e9SAndroid Build Coastguard Worker ({ volatile unsigned int _zzq_args[6]; \
935*da0073e9SAndroid Build Coastguard Worker volatile unsigned int _zzq_result; \
936*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned int)(_zzq_request); \
937*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned int)(_zzq_arg1); \
938*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned int)(_zzq_arg2); \
939*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned int)(_zzq_arg3); \
940*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned int)(_zzq_arg4); \
941*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned int)(_zzq_arg5); \
942*da0073e9SAndroid Build Coastguard Worker __asm__ volatile("move $11, %1\n\t" /*default*/ \
943*da0073e9SAndroid Build Coastguard Worker "move $12, %2\n\t" /*ptr*/ \
944*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
945*da0073e9SAndroid Build Coastguard Worker /* T3 = client_request ( T4 ) */ \
946*da0073e9SAndroid Build Coastguard Worker "or $13, $13, $13\n\t" \
947*da0073e9SAndroid Build Coastguard Worker "move %0, $11\n\t" /*result*/ \
948*da0073e9SAndroid Build Coastguard Worker : "=r" (_zzq_result) \
949*da0073e9SAndroid Build Coastguard Worker : "r" (_zzq_default), "r" (&_zzq_args[0]) \
950*da0073e9SAndroid Build Coastguard Worker : "$11", "$12", "memory"); \
951*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
952*da0073e9SAndroid Build Coastguard Worker })
953*da0073e9SAndroid Build Coastguard Worker
954*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
955*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
956*da0073e9SAndroid Build Coastguard Worker volatile unsigned int __addr; \
957*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
958*da0073e9SAndroid Build Coastguard Worker /* %t9 = guest_NRADDR */ \
959*da0073e9SAndroid Build Coastguard Worker "or $14, $14, $14\n\t" \
960*da0073e9SAndroid Build Coastguard Worker "move %0, $11" /*result*/ \
961*da0073e9SAndroid Build Coastguard Worker : "=r" (__addr) \
962*da0073e9SAndroid Build Coastguard Worker : \
963*da0073e9SAndroid Build Coastguard Worker : "$11" \
964*da0073e9SAndroid Build Coastguard Worker ); \
965*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
966*da0073e9SAndroid Build Coastguard Worker }
967*da0073e9SAndroid Build Coastguard Worker
968*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_T9 \
969*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
970*da0073e9SAndroid Build Coastguard Worker /* call-noredir *%t9 */ \
971*da0073e9SAndroid Build Coastguard Worker "or $15, $15, $15\n\t"
972*da0073e9SAndroid Build Coastguard Worker
973*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
974*da0073e9SAndroid Build Coastguard Worker do { \
975*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
976*da0073e9SAndroid Build Coastguard Worker "or $11, $11, $11\n\t" \
977*da0073e9SAndroid Build Coastguard Worker ); \
978*da0073e9SAndroid Build Coastguard Worker } while (0)
979*da0073e9SAndroid Build Coastguard Worker
980*da0073e9SAndroid Build Coastguard Worker
981*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_mips32_linux */
982*da0073e9SAndroid Build Coastguard Worker
983*da0073e9SAndroid Build Coastguard Worker /* ------------------------- mips64-linux ---------------- */
984*da0073e9SAndroid Build Coastguard Worker
985*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_mips64_linux)
986*da0073e9SAndroid Build Coastguard Worker
987*da0073e9SAndroid Build Coastguard Worker typedef
988*da0073e9SAndroid Build Coastguard Worker struct {
989*da0073e9SAndroid Build Coastguard Worker unsigned long nraddr; /* where's the code? */
990*da0073e9SAndroid Build Coastguard Worker }
991*da0073e9SAndroid Build Coastguard Worker OrigFn;
992*da0073e9SAndroid Build Coastguard Worker
993*da0073e9SAndroid Build Coastguard Worker /* dsll $0,$0, 3
994*da0073e9SAndroid Build Coastguard Worker * dsll $0,$0, 13
995*da0073e9SAndroid Build Coastguard Worker * dsll $0,$0, 29
996*da0073e9SAndroid Build Coastguard Worker * dsll $0,$0, 19*/
997*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE \
998*da0073e9SAndroid Build Coastguard Worker "dsll $0,$0, 3 ; dsll $0,$0,13\n\t" \
999*da0073e9SAndroid Build Coastguard Worker "dsll $0,$0,29 ; dsll $0,$0,19\n\t"
1000*da0073e9SAndroid Build Coastguard Worker
1001*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
1002*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
1003*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
1004*da0073e9SAndroid Build Coastguard Worker __extension__ \
1005*da0073e9SAndroid Build Coastguard Worker ({ volatile unsigned long int _zzq_args[6]; \
1006*da0073e9SAndroid Build Coastguard Worker volatile unsigned long int _zzq_result; \
1007*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned long int)(_zzq_request); \
1008*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned long int)(_zzq_arg1); \
1009*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned long int)(_zzq_arg2); \
1010*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned long int)(_zzq_arg3); \
1011*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned long int)(_zzq_arg4); \
1012*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned long int)(_zzq_arg5); \
1013*da0073e9SAndroid Build Coastguard Worker __asm__ volatile("move $11, %1\n\t" /*default*/ \
1014*da0073e9SAndroid Build Coastguard Worker "move $12, %2\n\t" /*ptr*/ \
1015*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
1016*da0073e9SAndroid Build Coastguard Worker /* $11 = client_request ( $12 ) */ \
1017*da0073e9SAndroid Build Coastguard Worker "or $13, $13, $13\n\t" \
1018*da0073e9SAndroid Build Coastguard Worker "move %0, $11\n\t" /*result*/ \
1019*da0073e9SAndroid Build Coastguard Worker : "=r" (_zzq_result) \
1020*da0073e9SAndroid Build Coastguard Worker : "r" (_zzq_default), "r" (&_zzq_args[0]) \
1021*da0073e9SAndroid Build Coastguard Worker : "$11", "$12", "memory"); \
1022*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
1023*da0073e9SAndroid Build Coastguard Worker })
1024*da0073e9SAndroid Build Coastguard Worker
1025*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
1026*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
1027*da0073e9SAndroid Build Coastguard Worker volatile unsigned long int __addr; \
1028*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
1029*da0073e9SAndroid Build Coastguard Worker /* $11 = guest_NRADDR */ \
1030*da0073e9SAndroid Build Coastguard Worker "or $14, $14, $14\n\t" \
1031*da0073e9SAndroid Build Coastguard Worker "move %0, $11" /*result*/ \
1032*da0073e9SAndroid Build Coastguard Worker : "=r" (__addr) \
1033*da0073e9SAndroid Build Coastguard Worker : \
1034*da0073e9SAndroid Build Coastguard Worker : "$11"); \
1035*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
1036*da0073e9SAndroid Build Coastguard Worker }
1037*da0073e9SAndroid Build Coastguard Worker
1038*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_T9 \
1039*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
1040*da0073e9SAndroid Build Coastguard Worker /* call-noredir $25 */ \
1041*da0073e9SAndroid Build Coastguard Worker "or $15, $15, $15\n\t"
1042*da0073e9SAndroid Build Coastguard Worker
1043*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
1044*da0073e9SAndroid Build Coastguard Worker do { \
1045*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
1046*da0073e9SAndroid Build Coastguard Worker "or $11, $11, $11\n\t" \
1047*da0073e9SAndroid Build Coastguard Worker ); \
1048*da0073e9SAndroid Build Coastguard Worker } while (0)
1049*da0073e9SAndroid Build Coastguard Worker
1050*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_mips64_linux */
1051*da0073e9SAndroid Build Coastguard Worker
1052*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_nanomips_linux)
1053*da0073e9SAndroid Build Coastguard Worker
1054*da0073e9SAndroid Build Coastguard Worker typedef
1055*da0073e9SAndroid Build Coastguard Worker struct {
1056*da0073e9SAndroid Build Coastguard Worker unsigned int nraddr; /* where's the code? */
1057*da0073e9SAndroid Build Coastguard Worker }
1058*da0073e9SAndroid Build Coastguard Worker OrigFn;
1059*da0073e9SAndroid Build Coastguard Worker /*
1060*da0073e9SAndroid Build Coastguard Worker 8000 c04d srl zero, zero, 13
1061*da0073e9SAndroid Build Coastguard Worker 8000 c05d srl zero, zero, 29
1062*da0073e9SAndroid Build Coastguard Worker 8000 c043 srl zero, zero, 3
1063*da0073e9SAndroid Build Coastguard Worker 8000 c053 srl zero, zero, 19
1064*da0073e9SAndroid Build Coastguard Worker */
1065*da0073e9SAndroid Build Coastguard Worker
1066*da0073e9SAndroid Build Coastguard Worker #define __SPECIAL_INSTRUCTION_PREAMBLE "srl[32] $zero, $zero, 13 \n\t" \
1067*da0073e9SAndroid Build Coastguard Worker "srl[32] $zero, $zero, 29 \n\t" \
1068*da0073e9SAndroid Build Coastguard Worker "srl[32] $zero, $zero, 3 \n\t" \
1069*da0073e9SAndroid Build Coastguard Worker "srl[32] $zero, $zero, 19 \n\t"
1070*da0073e9SAndroid Build Coastguard Worker
1071*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
1072*da0073e9SAndroid Build Coastguard Worker _zzq_default, _zzq_request, \
1073*da0073e9SAndroid Build Coastguard Worker _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
1074*da0073e9SAndroid Build Coastguard Worker __extension__ \
1075*da0073e9SAndroid Build Coastguard Worker ({ volatile unsigned int _zzq_args[6]; \
1076*da0073e9SAndroid Build Coastguard Worker volatile unsigned int _zzq_result; \
1077*da0073e9SAndroid Build Coastguard Worker _zzq_args[0] = (unsigned int)(_zzq_request); \
1078*da0073e9SAndroid Build Coastguard Worker _zzq_args[1] = (unsigned int)(_zzq_arg1); \
1079*da0073e9SAndroid Build Coastguard Worker _zzq_args[2] = (unsigned int)(_zzq_arg2); \
1080*da0073e9SAndroid Build Coastguard Worker _zzq_args[3] = (unsigned int)(_zzq_arg3); \
1081*da0073e9SAndroid Build Coastguard Worker _zzq_args[4] = (unsigned int)(_zzq_arg4); \
1082*da0073e9SAndroid Build Coastguard Worker _zzq_args[5] = (unsigned int)(_zzq_arg5); \
1083*da0073e9SAndroid Build Coastguard Worker __asm__ volatile("move $a7, %1\n\t" /* default */ \
1084*da0073e9SAndroid Build Coastguard Worker "move $t0, %2\n\t" /* ptr */ \
1085*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
1086*da0073e9SAndroid Build Coastguard Worker /* $a7 = client_request( $t0 ) */ \
1087*da0073e9SAndroid Build Coastguard Worker "or[32] $t0, $t0, $t0\n\t" \
1088*da0073e9SAndroid Build Coastguard Worker "move %0, $a7\n\t" /* result */ \
1089*da0073e9SAndroid Build Coastguard Worker : "=r" (_zzq_result) \
1090*da0073e9SAndroid Build Coastguard Worker : "r" (_zzq_default), "r" (&_zzq_args[0]) \
1091*da0073e9SAndroid Build Coastguard Worker : "$a7", "$t0", "memory"); \
1092*da0073e9SAndroid Build Coastguard Worker _zzq_result; \
1093*da0073e9SAndroid Build Coastguard Worker })
1094*da0073e9SAndroid Build Coastguard Worker
1095*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
1096*da0073e9SAndroid Build Coastguard Worker { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
1097*da0073e9SAndroid Build Coastguard Worker volatile unsigned long int __addr; \
1098*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
1099*da0073e9SAndroid Build Coastguard Worker /* $a7 = guest_NRADDR */ \
1100*da0073e9SAndroid Build Coastguard Worker "or[32] $t1, $t1, $t1\n\t" \
1101*da0073e9SAndroid Build Coastguard Worker "move %0, $a7" /*result*/ \
1102*da0073e9SAndroid Build Coastguard Worker : "=r" (__addr) \
1103*da0073e9SAndroid Build Coastguard Worker : \
1104*da0073e9SAndroid Build Coastguard Worker : "$a7"); \
1105*da0073e9SAndroid Build Coastguard Worker _zzq_orig->nraddr = __addr; \
1106*da0073e9SAndroid Build Coastguard Worker }
1107*da0073e9SAndroid Build Coastguard Worker
1108*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CALL_NOREDIR_T9 \
1109*da0073e9SAndroid Build Coastguard Worker __SPECIAL_INSTRUCTION_PREAMBLE \
1110*da0073e9SAndroid Build Coastguard Worker /* call-noredir $25 */ \
1111*da0073e9SAndroid Build Coastguard Worker "or[32] $t2, $t2, $t2\n\t"
1112*da0073e9SAndroid Build Coastguard Worker
1113*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_VEX_INJECT_IR() \
1114*da0073e9SAndroid Build Coastguard Worker do { \
1115*da0073e9SAndroid Build Coastguard Worker __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
1116*da0073e9SAndroid Build Coastguard Worker "or[32] $t3, $t3, $t3\n\t" \
1117*da0073e9SAndroid Build Coastguard Worker ); \
1118*da0073e9SAndroid Build Coastguard Worker } while (0)
1119*da0073e9SAndroid Build Coastguard Worker
1120*da0073e9SAndroid Build Coastguard Worker #endif
1121*da0073e9SAndroid Build Coastguard Worker /* Insert assembly code for other platforms here... */
1122*da0073e9SAndroid Build Coastguard Worker
1123*da0073e9SAndroid Build Coastguard Worker #endif /* NVALGRIND */
1124*da0073e9SAndroid Build Coastguard Worker
1125*da0073e9SAndroid Build Coastguard Worker
1126*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
1127*da0073e9SAndroid Build Coastguard Worker /* PLATFORM SPECIFICS for FUNCTION WRAPPING. This is all very */
1128*da0073e9SAndroid Build Coastguard Worker /* ugly. It's the least-worst tradeoff I can think of. */
1129*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
1130*da0073e9SAndroid Build Coastguard Worker
1131*da0073e9SAndroid Build Coastguard Worker /* This section defines magic (a.k.a appalling-hack) macros for doing
1132*da0073e9SAndroid Build Coastguard Worker guaranteed-no-redirection macros, so as to get from function
1133*da0073e9SAndroid Build Coastguard Worker wrappers to the functions they are wrapping. The whole point is to
1134*da0073e9SAndroid Build Coastguard Worker construct standard call sequences, but to do the call itself with a
1135*da0073e9SAndroid Build Coastguard Worker special no-redirect call pseudo-instruction that the JIT
1136*da0073e9SAndroid Build Coastguard Worker understands and handles specially. This section is long and
1137*da0073e9SAndroid Build Coastguard Worker repetitious, and I can't see a way to make it shorter.
1138*da0073e9SAndroid Build Coastguard Worker
1139*da0073e9SAndroid Build Coastguard Worker The naming scheme is as follows:
1140*da0073e9SAndroid Build Coastguard Worker
1141*da0073e9SAndroid Build Coastguard Worker CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc}
1142*da0073e9SAndroid Build Coastguard Worker
1143*da0073e9SAndroid Build Coastguard Worker 'W' stands for "word" and 'v' for "void". Hence there are
1144*da0073e9SAndroid Build Coastguard Worker different macros for calling arity 0, 1, 2, 3, 4, etc, functions,
1145*da0073e9SAndroid Build Coastguard Worker and for each, the possibility of returning a word-typed result, or
1146*da0073e9SAndroid Build Coastguard Worker no result.
1147*da0073e9SAndroid Build Coastguard Worker */
1148*da0073e9SAndroid Build Coastguard Worker
1149*da0073e9SAndroid Build Coastguard Worker /* Use these to write the name of your wrapper. NOTE: duplicates
1150*da0073e9SAndroid Build Coastguard Worker VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. NOTE also: inserts
1151*da0073e9SAndroid Build Coastguard Worker the default behaviour equivalance class tag "0000" into the name.
1152*da0073e9SAndroid Build Coastguard Worker See pub_tool_redir.h for details -- normally you don't need to
1153*da0073e9SAndroid Build Coastguard Worker think about this, though. */
1154*da0073e9SAndroid Build Coastguard Worker
1155*da0073e9SAndroid Build Coastguard Worker /* Use an extra level of macroisation so as to ensure the soname/fnname
1156*da0073e9SAndroid Build Coastguard Worker args are fully macro-expanded before pasting them together. */
1157*da0073e9SAndroid Build Coastguard Worker #define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
1158*da0073e9SAndroid Build Coastguard Worker
1159*da0073e9SAndroid Build Coastguard Worker #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \
1160*da0073e9SAndroid Build Coastguard Worker VG_CONCAT4(_vgw00000ZU_,soname,_,fnname)
1161*da0073e9SAndroid Build Coastguard Worker
1162*da0073e9SAndroid Build Coastguard Worker #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \
1163*da0073e9SAndroid Build Coastguard Worker VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname)
1164*da0073e9SAndroid Build Coastguard Worker
1165*da0073e9SAndroid Build Coastguard Worker /* Use this macro from within a wrapper function to collect the
1166*da0073e9SAndroid Build Coastguard Worker context (address and possibly other info) of the original function.
1167*da0073e9SAndroid Build Coastguard Worker Once you have that you can then use it in one of the CALL_FN_
1168*da0073e9SAndroid Build Coastguard Worker macros. The type of the argument _lval is OrigFn. */
1169*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval)
1170*da0073e9SAndroid Build Coastguard Worker
1171*da0073e9SAndroid Build Coastguard Worker /* Also provide end-user facilities for function replacement, rather
1172*da0073e9SAndroid Build Coastguard Worker than wrapping. A replacement function differs from a wrapper in
1173*da0073e9SAndroid Build Coastguard Worker that it has no way to get hold of the original function being
1174*da0073e9SAndroid Build Coastguard Worker called, and hence no way to call onwards to it. In a replacement
1175*da0073e9SAndroid Build Coastguard Worker function, VALGRIND_GET_ORIG_FN always returns zero. */
1176*da0073e9SAndroid Build Coastguard Worker
1177*da0073e9SAndroid Build Coastguard Worker #define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname) \
1178*da0073e9SAndroid Build Coastguard Worker VG_CONCAT4(_vgr00000ZU_,soname,_,fnname)
1179*da0073e9SAndroid Build Coastguard Worker
1180*da0073e9SAndroid Build Coastguard Worker #define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname) \
1181*da0073e9SAndroid Build Coastguard Worker VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname)
1182*da0073e9SAndroid Build Coastguard Worker
1183*da0073e9SAndroid Build Coastguard Worker /* Derivatives of the main macros below, for calling functions
1184*da0073e9SAndroid Build Coastguard Worker returning void. */
1185*da0073e9SAndroid Build Coastguard Worker
1186*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_v(fnptr) \
1187*da0073e9SAndroid Build Coastguard Worker do { volatile unsigned long _junk; \
1188*da0073e9SAndroid Build Coastguard Worker CALL_FN_W_v(_junk,fnptr); } while (0)
1189*da0073e9SAndroid Build Coastguard Worker
1190*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_W(fnptr, arg1) \
1191*da0073e9SAndroid Build Coastguard Worker do { volatile unsigned long _junk; \
1192*da0073e9SAndroid Build Coastguard Worker CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
1193*da0073e9SAndroid Build Coastguard Worker
1194*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_WW(fnptr, arg1,arg2) \
1195*da0073e9SAndroid Build Coastguard Worker do { volatile unsigned long _junk; \
1196*da0073e9SAndroid Build Coastguard Worker CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
1197*da0073e9SAndroid Build Coastguard Worker
1198*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \
1199*da0073e9SAndroid Build Coastguard Worker do { volatile unsigned long _junk; \
1200*da0073e9SAndroid Build Coastguard Worker CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
1201*da0073e9SAndroid Build Coastguard Worker
1202*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \
1203*da0073e9SAndroid Build Coastguard Worker do { volatile unsigned long _junk; \
1204*da0073e9SAndroid Build Coastguard Worker CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
1205*da0073e9SAndroid Build Coastguard Worker
1206*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \
1207*da0073e9SAndroid Build Coastguard Worker do { volatile unsigned long _junk; \
1208*da0073e9SAndroid Build Coastguard Worker CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
1209*da0073e9SAndroid Build Coastguard Worker
1210*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \
1211*da0073e9SAndroid Build Coastguard Worker do { volatile unsigned long _junk; \
1212*da0073e9SAndroid Build Coastguard Worker CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
1213*da0073e9SAndroid Build Coastguard Worker
1214*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
1215*da0073e9SAndroid Build Coastguard Worker do { volatile unsigned long _junk; \
1216*da0073e9SAndroid Build Coastguard Worker CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
1217*da0073e9SAndroid Build Coastguard Worker
1218*da0073e9SAndroid Build Coastguard Worker /* ----------------- x86-{linux,darwin,solaris} ---------------- */
1219*da0073e9SAndroid Build Coastguard Worker
1220*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \
1221*da0073e9SAndroid Build Coastguard Worker || defined(PLAT_x86_solaris)
1222*da0073e9SAndroid Build Coastguard Worker
1223*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. No need to mention eax
1224*da0073e9SAndroid Build Coastguard Worker as gcc can already see that, plus causes gcc to bomb. */
1225*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx"
1226*da0073e9SAndroid Build Coastguard Worker
1227*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
1228*da0073e9SAndroid Build Coastguard Worker call and restore it afterwards as gcc may not keep the stack
1229*da0073e9SAndroid Build Coastguard Worker pointer aligned if it doesn't realise calls are being made
1230*da0073e9SAndroid Build Coastguard Worker to other functions. */
1231*da0073e9SAndroid Build Coastguard Worker
1232*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK \
1233*da0073e9SAndroid Build Coastguard Worker "movl %%esp,%%edi\n\t" \
1234*da0073e9SAndroid Build Coastguard Worker "andl $0xfffffff0,%%esp\n\t"
1235*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK \
1236*da0073e9SAndroid Build Coastguard Worker "movl %%edi,%%esp\n\t"
1237*da0073e9SAndroid Build Coastguard Worker
1238*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned
1239*da0073e9SAndroid Build Coastguard Worker long) == 4. */
1240*da0073e9SAndroid Build Coastguard Worker
1241*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
1242*da0073e9SAndroid Build Coastguard Worker do { \
1243*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1244*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[1]; \
1245*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1246*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1247*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1248*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1249*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1250*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1251*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1252*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1253*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1254*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1255*da0073e9SAndroid Build Coastguard Worker ); \
1256*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1257*da0073e9SAndroid Build Coastguard Worker } while (0)
1258*da0073e9SAndroid Build Coastguard Worker
1259*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
1260*da0073e9SAndroid Build Coastguard Worker do { \
1261*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1262*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[2]; \
1263*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1264*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1265*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1266*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1267*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1268*da0073e9SAndroid Build Coastguard Worker "subl $12, %%esp\n\t" \
1269*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1270*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1271*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1272*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1273*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1274*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1275*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1276*da0073e9SAndroid Build Coastguard Worker ); \
1277*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1278*da0073e9SAndroid Build Coastguard Worker } while (0)
1279*da0073e9SAndroid Build Coastguard Worker
1280*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1281*da0073e9SAndroid Build Coastguard Worker do { \
1282*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1283*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3]; \
1284*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1285*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1286*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1287*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1288*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1289*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1290*da0073e9SAndroid Build Coastguard Worker "subl $8, %%esp\n\t" \
1291*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1292*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1293*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1294*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1295*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1296*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1297*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1298*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1299*da0073e9SAndroid Build Coastguard Worker ); \
1300*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1301*da0073e9SAndroid Build Coastguard Worker } while (0)
1302*da0073e9SAndroid Build Coastguard Worker
1303*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1304*da0073e9SAndroid Build Coastguard Worker do { \
1305*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1306*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[4]; \
1307*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1308*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1309*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1310*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1311*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1312*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1313*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1314*da0073e9SAndroid Build Coastguard Worker "subl $4, %%esp\n\t" \
1315*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1316*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1317*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1318*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1319*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1320*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1321*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1322*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1323*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1324*da0073e9SAndroid Build Coastguard Worker ); \
1325*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1326*da0073e9SAndroid Build Coastguard Worker } while (0)
1327*da0073e9SAndroid Build Coastguard Worker
1328*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1329*da0073e9SAndroid Build Coastguard Worker do { \
1330*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1331*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[5]; \
1332*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1333*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1334*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1335*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1336*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1337*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1338*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1339*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1340*da0073e9SAndroid Build Coastguard Worker "pushl 16(%%eax)\n\t" \
1341*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1342*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1343*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1344*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1345*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1346*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1347*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1348*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1349*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1350*da0073e9SAndroid Build Coastguard Worker ); \
1351*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1352*da0073e9SAndroid Build Coastguard Worker } while (0)
1353*da0073e9SAndroid Build Coastguard Worker
1354*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1355*da0073e9SAndroid Build Coastguard Worker do { \
1356*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1357*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[6]; \
1358*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1359*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1360*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1361*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1362*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1363*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1364*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1365*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1366*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1367*da0073e9SAndroid Build Coastguard Worker "subl $12, %%esp\n\t" \
1368*da0073e9SAndroid Build Coastguard Worker "pushl 20(%%eax)\n\t" \
1369*da0073e9SAndroid Build Coastguard Worker "pushl 16(%%eax)\n\t" \
1370*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1371*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1372*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1373*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1374*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1375*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1376*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1377*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1378*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1379*da0073e9SAndroid Build Coastguard Worker ); \
1380*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1381*da0073e9SAndroid Build Coastguard Worker } while (0)
1382*da0073e9SAndroid Build Coastguard Worker
1383*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1384*da0073e9SAndroid Build Coastguard Worker do { \
1385*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1386*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[7]; \
1387*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1388*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1389*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1390*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1391*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1392*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1393*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1394*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
1395*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1396*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1397*da0073e9SAndroid Build Coastguard Worker "subl $8, %%esp\n\t" \
1398*da0073e9SAndroid Build Coastguard Worker "pushl 24(%%eax)\n\t" \
1399*da0073e9SAndroid Build Coastguard Worker "pushl 20(%%eax)\n\t" \
1400*da0073e9SAndroid Build Coastguard Worker "pushl 16(%%eax)\n\t" \
1401*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1402*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1403*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1404*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1405*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1406*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1407*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1408*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1409*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1410*da0073e9SAndroid Build Coastguard Worker ); \
1411*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1412*da0073e9SAndroid Build Coastguard Worker } while (0)
1413*da0073e9SAndroid Build Coastguard Worker
1414*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1415*da0073e9SAndroid Build Coastguard Worker arg7) \
1416*da0073e9SAndroid Build Coastguard Worker do { \
1417*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1418*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[8]; \
1419*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1420*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1421*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1422*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1423*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1424*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1425*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1426*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
1427*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
1428*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1429*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1430*da0073e9SAndroid Build Coastguard Worker "subl $4, %%esp\n\t" \
1431*da0073e9SAndroid Build Coastguard Worker "pushl 28(%%eax)\n\t" \
1432*da0073e9SAndroid Build Coastguard Worker "pushl 24(%%eax)\n\t" \
1433*da0073e9SAndroid Build Coastguard Worker "pushl 20(%%eax)\n\t" \
1434*da0073e9SAndroid Build Coastguard Worker "pushl 16(%%eax)\n\t" \
1435*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1436*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1437*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1438*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1439*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1440*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1441*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1442*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1443*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1444*da0073e9SAndroid Build Coastguard Worker ); \
1445*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1446*da0073e9SAndroid Build Coastguard Worker } while (0)
1447*da0073e9SAndroid Build Coastguard Worker
1448*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1449*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
1450*da0073e9SAndroid Build Coastguard Worker do { \
1451*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1452*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[9]; \
1453*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1454*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1455*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1456*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1457*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1458*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1459*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1460*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
1461*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
1462*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
1463*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1464*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1465*da0073e9SAndroid Build Coastguard Worker "pushl 32(%%eax)\n\t" \
1466*da0073e9SAndroid Build Coastguard Worker "pushl 28(%%eax)\n\t" \
1467*da0073e9SAndroid Build Coastguard Worker "pushl 24(%%eax)\n\t" \
1468*da0073e9SAndroid Build Coastguard Worker "pushl 20(%%eax)\n\t" \
1469*da0073e9SAndroid Build Coastguard Worker "pushl 16(%%eax)\n\t" \
1470*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1471*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1472*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1473*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1474*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1475*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1476*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1477*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1478*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1479*da0073e9SAndroid Build Coastguard Worker ); \
1480*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1481*da0073e9SAndroid Build Coastguard Worker } while (0)
1482*da0073e9SAndroid Build Coastguard Worker
1483*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1484*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
1485*da0073e9SAndroid Build Coastguard Worker do { \
1486*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1487*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[10]; \
1488*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1489*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1490*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1491*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1492*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1493*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1494*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1495*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
1496*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
1497*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
1498*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
1499*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1500*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1501*da0073e9SAndroid Build Coastguard Worker "subl $12, %%esp\n\t" \
1502*da0073e9SAndroid Build Coastguard Worker "pushl 36(%%eax)\n\t" \
1503*da0073e9SAndroid Build Coastguard Worker "pushl 32(%%eax)\n\t" \
1504*da0073e9SAndroid Build Coastguard Worker "pushl 28(%%eax)\n\t" \
1505*da0073e9SAndroid Build Coastguard Worker "pushl 24(%%eax)\n\t" \
1506*da0073e9SAndroid Build Coastguard Worker "pushl 20(%%eax)\n\t" \
1507*da0073e9SAndroid Build Coastguard Worker "pushl 16(%%eax)\n\t" \
1508*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1509*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1510*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1511*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1512*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1513*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1514*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1515*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1516*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1517*da0073e9SAndroid Build Coastguard Worker ); \
1518*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1519*da0073e9SAndroid Build Coastguard Worker } while (0)
1520*da0073e9SAndroid Build Coastguard Worker
1521*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1522*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
1523*da0073e9SAndroid Build Coastguard Worker do { \
1524*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1525*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[11]; \
1526*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1527*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1528*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1529*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1530*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1531*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1532*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1533*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
1534*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
1535*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
1536*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
1537*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
1538*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1539*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1540*da0073e9SAndroid Build Coastguard Worker "subl $8, %%esp\n\t" \
1541*da0073e9SAndroid Build Coastguard Worker "pushl 40(%%eax)\n\t" \
1542*da0073e9SAndroid Build Coastguard Worker "pushl 36(%%eax)\n\t" \
1543*da0073e9SAndroid Build Coastguard Worker "pushl 32(%%eax)\n\t" \
1544*da0073e9SAndroid Build Coastguard Worker "pushl 28(%%eax)\n\t" \
1545*da0073e9SAndroid Build Coastguard Worker "pushl 24(%%eax)\n\t" \
1546*da0073e9SAndroid Build Coastguard Worker "pushl 20(%%eax)\n\t" \
1547*da0073e9SAndroid Build Coastguard Worker "pushl 16(%%eax)\n\t" \
1548*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1549*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1550*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1551*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1552*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1553*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1554*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1555*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1556*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1557*da0073e9SAndroid Build Coastguard Worker ); \
1558*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1559*da0073e9SAndroid Build Coastguard Worker } while (0)
1560*da0073e9SAndroid Build Coastguard Worker
1561*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1562*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
1563*da0073e9SAndroid Build Coastguard Worker arg11) \
1564*da0073e9SAndroid Build Coastguard Worker do { \
1565*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1566*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[12]; \
1567*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1568*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1569*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1570*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1571*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1572*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1573*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1574*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
1575*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
1576*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
1577*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
1578*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
1579*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
1580*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1581*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1582*da0073e9SAndroid Build Coastguard Worker "subl $4, %%esp\n\t" \
1583*da0073e9SAndroid Build Coastguard Worker "pushl 44(%%eax)\n\t" \
1584*da0073e9SAndroid Build Coastguard Worker "pushl 40(%%eax)\n\t" \
1585*da0073e9SAndroid Build Coastguard Worker "pushl 36(%%eax)\n\t" \
1586*da0073e9SAndroid Build Coastguard Worker "pushl 32(%%eax)\n\t" \
1587*da0073e9SAndroid Build Coastguard Worker "pushl 28(%%eax)\n\t" \
1588*da0073e9SAndroid Build Coastguard Worker "pushl 24(%%eax)\n\t" \
1589*da0073e9SAndroid Build Coastguard Worker "pushl 20(%%eax)\n\t" \
1590*da0073e9SAndroid Build Coastguard Worker "pushl 16(%%eax)\n\t" \
1591*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1592*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1593*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1594*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1595*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1596*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1597*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1598*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1599*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1600*da0073e9SAndroid Build Coastguard Worker ); \
1601*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1602*da0073e9SAndroid Build Coastguard Worker } while (0)
1603*da0073e9SAndroid Build Coastguard Worker
1604*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1605*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
1606*da0073e9SAndroid Build Coastguard Worker arg11,arg12) \
1607*da0073e9SAndroid Build Coastguard Worker do { \
1608*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1609*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[13]; \
1610*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1611*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1612*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1613*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1614*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1615*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1616*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1617*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
1618*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
1619*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
1620*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
1621*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
1622*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
1623*da0073e9SAndroid Build Coastguard Worker _argvec[12] = (unsigned long)(arg12); \
1624*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1625*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1626*da0073e9SAndroid Build Coastguard Worker "pushl 48(%%eax)\n\t" \
1627*da0073e9SAndroid Build Coastguard Worker "pushl 44(%%eax)\n\t" \
1628*da0073e9SAndroid Build Coastguard Worker "pushl 40(%%eax)\n\t" \
1629*da0073e9SAndroid Build Coastguard Worker "pushl 36(%%eax)\n\t" \
1630*da0073e9SAndroid Build Coastguard Worker "pushl 32(%%eax)\n\t" \
1631*da0073e9SAndroid Build Coastguard Worker "pushl 28(%%eax)\n\t" \
1632*da0073e9SAndroid Build Coastguard Worker "pushl 24(%%eax)\n\t" \
1633*da0073e9SAndroid Build Coastguard Worker "pushl 20(%%eax)\n\t" \
1634*da0073e9SAndroid Build Coastguard Worker "pushl 16(%%eax)\n\t" \
1635*da0073e9SAndroid Build Coastguard Worker "pushl 12(%%eax)\n\t" \
1636*da0073e9SAndroid Build Coastguard Worker "pushl 8(%%eax)\n\t" \
1637*da0073e9SAndroid Build Coastguard Worker "pushl 4(%%eax)\n\t" \
1638*da0073e9SAndroid Build Coastguard Worker "movl (%%eax), %%eax\n\t" /* target->%eax */ \
1639*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_EAX \
1640*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1641*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1642*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) \
1643*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1644*da0073e9SAndroid Build Coastguard Worker ); \
1645*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1646*da0073e9SAndroid Build Coastguard Worker } while (0)
1647*da0073e9SAndroid Build Coastguard Worker
1648*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_x86_linux || PLAT_x86_darwin || PLAT_x86_solaris */
1649*da0073e9SAndroid Build Coastguard Worker
1650*da0073e9SAndroid Build Coastguard Worker /* ---------------- amd64-{linux,darwin,solaris} --------------- */
1651*da0073e9SAndroid Build Coastguard Worker
1652*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) \
1653*da0073e9SAndroid Build Coastguard Worker || defined(PLAT_amd64_solaris)
1654*da0073e9SAndroid Build Coastguard Worker
1655*da0073e9SAndroid Build Coastguard Worker /* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */
1656*da0073e9SAndroid Build Coastguard Worker
1657*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
1658*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi", \
1659*da0073e9SAndroid Build Coastguard Worker "rdi", "r8", "r9", "r10", "r11"
1660*da0073e9SAndroid Build Coastguard Worker
1661*da0073e9SAndroid Build Coastguard Worker /* This is all pretty complex. It's so as to make stack unwinding
1662*da0073e9SAndroid Build Coastguard Worker work reliably. See bug 243270. The basic problem is the sub and
1663*da0073e9SAndroid Build Coastguard Worker add of 128 of %rsp in all of the following macros. If gcc believes
1664*da0073e9SAndroid Build Coastguard Worker the CFA is in %rsp, then unwinding may fail, because what's at the
1665*da0073e9SAndroid Build Coastguard Worker CFA is not what gcc "expected" when it constructs the CFIs for the
1666*da0073e9SAndroid Build Coastguard Worker places where the macros are instantiated.
1667*da0073e9SAndroid Build Coastguard Worker
1668*da0073e9SAndroid Build Coastguard Worker But we can't just add a CFI annotation to increase the CFA offset
1669*da0073e9SAndroid Build Coastguard Worker by 128, to match the sub of 128 from %rsp, because we don't know
1670*da0073e9SAndroid Build Coastguard Worker whether gcc has chosen %rsp as the CFA at that point, or whether it
1671*da0073e9SAndroid Build Coastguard Worker has chosen some other register (eg, %rbp). In the latter case,
1672*da0073e9SAndroid Build Coastguard Worker adding a CFI annotation to change the CFA offset is simply wrong.
1673*da0073e9SAndroid Build Coastguard Worker
1674*da0073e9SAndroid Build Coastguard Worker So the solution is to get hold of the CFA using
1675*da0073e9SAndroid Build Coastguard Worker __builtin_dwarf_cfa(), put it in a known register, and add a
1676*da0073e9SAndroid Build Coastguard Worker CFI annotation to say what the register is. We choose %rbp for
1677*da0073e9SAndroid Build Coastguard Worker this (perhaps perversely), because:
1678*da0073e9SAndroid Build Coastguard Worker
1679*da0073e9SAndroid Build Coastguard Worker (1) %rbp is already subject to unwinding. If a new register was
1680*da0073e9SAndroid Build Coastguard Worker chosen then the unwinder would have to unwind it in all stack
1681*da0073e9SAndroid Build Coastguard Worker traces, which is expensive, and
1682*da0073e9SAndroid Build Coastguard Worker
1683*da0073e9SAndroid Build Coastguard Worker (2) %rbp is already subject to precise exception updates in the
1684*da0073e9SAndroid Build Coastguard Worker JIT. If a new register was chosen, we'd have to have precise
1685*da0073e9SAndroid Build Coastguard Worker exceptions for it too, which reduces performance of the
1686*da0073e9SAndroid Build Coastguard Worker generated code.
1687*da0073e9SAndroid Build Coastguard Worker
1688*da0073e9SAndroid Build Coastguard Worker However .. one extra complication. We can't just whack the result
1689*da0073e9SAndroid Build Coastguard Worker of __builtin_dwarf_cfa() into %rbp and then add %rbp to the
1690*da0073e9SAndroid Build Coastguard Worker list of trashed registers at the end of the inline assembly
1691*da0073e9SAndroid Build Coastguard Worker fragments; gcc won't allow %rbp to appear in that list. Hence
1692*da0073e9SAndroid Build Coastguard Worker instead we need to stash %rbp in %r15 for the duration of the asm,
1693*da0073e9SAndroid Build Coastguard Worker and say that %r15 is trashed instead. gcc seems happy to go with
1694*da0073e9SAndroid Build Coastguard Worker that.
1695*da0073e9SAndroid Build Coastguard Worker
1696*da0073e9SAndroid Build Coastguard Worker Oh .. and this all needs to be conditionalised so that it is
1697*da0073e9SAndroid Build Coastguard Worker unchanged from before this commit, when compiled with older gccs
1698*da0073e9SAndroid Build Coastguard Worker that don't support __builtin_dwarf_cfa. Furthermore, since
1699*da0073e9SAndroid Build Coastguard Worker this header file is freestanding, it has to be independent of
1700*da0073e9SAndroid Build Coastguard Worker config.h, and so the following conditionalisation cannot depend on
1701*da0073e9SAndroid Build Coastguard Worker configure time checks.
1702*da0073e9SAndroid Build Coastguard Worker
1703*da0073e9SAndroid Build Coastguard Worker Although it's not clear from
1704*da0073e9SAndroid Build Coastguard Worker 'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)',
1705*da0073e9SAndroid Build Coastguard Worker this expression excludes Darwin.
1706*da0073e9SAndroid Build Coastguard Worker .cfi directives in Darwin assembly appear to be completely
1707*da0073e9SAndroid Build Coastguard Worker different and I haven't investigated how they work.
1708*da0073e9SAndroid Build Coastguard Worker
1709*da0073e9SAndroid Build Coastguard Worker For even more entertainment value, note we have to use the
1710*da0073e9SAndroid Build Coastguard Worker completely undocumented __builtin_dwarf_cfa(), which appears to
1711*da0073e9SAndroid Build Coastguard Worker really compute the CFA, whereas __builtin_frame_address(0) claims
1712*da0073e9SAndroid Build Coastguard Worker to but actually doesn't. See
1713*da0073e9SAndroid Build Coastguard Worker https://bugs.kde.org/show_bug.cgi?id=243270#c47
1714*da0073e9SAndroid Build Coastguard Worker */
1715*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
1716*da0073e9SAndroid Build Coastguard Worker # define __FRAME_POINTER \
1717*da0073e9SAndroid Build Coastguard Worker ,"r"(__builtin_dwarf_cfa())
1718*da0073e9SAndroid Build Coastguard Worker # define VALGRIND_CFI_PROLOGUE \
1719*da0073e9SAndroid Build Coastguard Worker "movq %%rbp, %%r15\n\t" \
1720*da0073e9SAndroid Build Coastguard Worker "movq %2, %%rbp\n\t" \
1721*da0073e9SAndroid Build Coastguard Worker ".cfi_remember_state\n\t" \
1722*da0073e9SAndroid Build Coastguard Worker ".cfi_def_cfa rbp, 0\n\t"
1723*da0073e9SAndroid Build Coastguard Worker # define VALGRIND_CFI_EPILOGUE \
1724*da0073e9SAndroid Build Coastguard Worker "movq %%r15, %%rbp\n\t" \
1725*da0073e9SAndroid Build Coastguard Worker ".cfi_restore_state\n\t"
1726*da0073e9SAndroid Build Coastguard Worker #else
1727*da0073e9SAndroid Build Coastguard Worker # define __FRAME_POINTER
1728*da0073e9SAndroid Build Coastguard Worker # define VALGRIND_CFI_PROLOGUE
1729*da0073e9SAndroid Build Coastguard Worker # define VALGRIND_CFI_EPILOGUE
1730*da0073e9SAndroid Build Coastguard Worker #endif
1731*da0073e9SAndroid Build Coastguard Worker
1732*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
1733*da0073e9SAndroid Build Coastguard Worker call and restore it afterwards as gcc may not keep the stack
1734*da0073e9SAndroid Build Coastguard Worker pointer aligned if it doesn't realise calls are being made
1735*da0073e9SAndroid Build Coastguard Worker to other functions. */
1736*da0073e9SAndroid Build Coastguard Worker
1737*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK \
1738*da0073e9SAndroid Build Coastguard Worker "movq %%rsp,%%r14\n\t" \
1739*da0073e9SAndroid Build Coastguard Worker "andq $0xfffffffffffffff0,%%rsp\n\t"
1740*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK \
1741*da0073e9SAndroid Build Coastguard Worker "movq %%r14,%%rsp\n\t"
1742*da0073e9SAndroid Build Coastguard Worker
1743*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned
1744*da0073e9SAndroid Build Coastguard Worker long) == 8. */
1745*da0073e9SAndroid Build Coastguard Worker
1746*da0073e9SAndroid Build Coastguard Worker /* NB 9 Sept 07. There is a nasty kludge here in all these CALL_FN_
1747*da0073e9SAndroid Build Coastguard Worker macros. In order not to trash the stack redzone, we need to drop
1748*da0073e9SAndroid Build Coastguard Worker %rsp by 128 before the hidden call, and restore afterwards. The
1749*da0073e9SAndroid Build Coastguard Worker nastyness is that it is only by luck that the stack still appears
1750*da0073e9SAndroid Build Coastguard Worker to be unwindable during the hidden call - since then the behaviour
1751*da0073e9SAndroid Build Coastguard Worker of any routine using this macro does not match what the CFI data
1752*da0073e9SAndroid Build Coastguard Worker says. Sigh.
1753*da0073e9SAndroid Build Coastguard Worker
1754*da0073e9SAndroid Build Coastguard Worker Why is this important? Imagine that a wrapper has a stack
1755*da0073e9SAndroid Build Coastguard Worker allocated local, and passes to the hidden call, a pointer to it.
1756*da0073e9SAndroid Build Coastguard Worker Because gcc does not know about the hidden call, it may allocate
1757*da0073e9SAndroid Build Coastguard Worker that local in the redzone. Unfortunately the hidden call may then
1758*da0073e9SAndroid Build Coastguard Worker trash it before it comes to use it. So we must step clear of the
1759*da0073e9SAndroid Build Coastguard Worker redzone, for the duration of the hidden call, to make it safe.
1760*da0073e9SAndroid Build Coastguard Worker
1761*da0073e9SAndroid Build Coastguard Worker Probably the same problem afflicts the other redzone-style ABIs too
1762*da0073e9SAndroid Build Coastguard Worker (ppc64-linux); but for those, the stack is
1763*da0073e9SAndroid Build Coastguard Worker self describing (none of this CFI nonsense) so at least messing
1764*da0073e9SAndroid Build Coastguard Worker with the stack pointer doesn't give a danger of non-unwindable
1765*da0073e9SAndroid Build Coastguard Worker stack. */
1766*da0073e9SAndroid Build Coastguard Worker
1767*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
1768*da0073e9SAndroid Build Coastguard Worker do { \
1769*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1770*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[1]; \
1771*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1772*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1773*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1774*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
1775*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1776*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
1777*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
1778*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
1779*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1780*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
1781*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1782*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
1783*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1784*da0073e9SAndroid Build Coastguard Worker ); \
1785*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1786*da0073e9SAndroid Build Coastguard Worker } while (0)
1787*da0073e9SAndroid Build Coastguard Worker
1788*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
1789*da0073e9SAndroid Build Coastguard Worker do { \
1790*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1791*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[2]; \
1792*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1793*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1794*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1795*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1796*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
1797*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1798*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
1799*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
1800*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
1801*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
1802*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1803*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
1804*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1805*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
1806*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1807*da0073e9SAndroid Build Coastguard Worker ); \
1808*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1809*da0073e9SAndroid Build Coastguard Worker } while (0)
1810*da0073e9SAndroid Build Coastguard Worker
1811*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1812*da0073e9SAndroid Build Coastguard Worker do { \
1813*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1814*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3]; \
1815*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1816*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1817*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1818*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1819*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1820*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
1821*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1822*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
1823*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
1824*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
1825*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
1826*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
1827*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1828*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
1829*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1830*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
1831*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1832*da0073e9SAndroid Build Coastguard Worker ); \
1833*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1834*da0073e9SAndroid Build Coastguard Worker } while (0)
1835*da0073e9SAndroid Build Coastguard Worker
1836*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1837*da0073e9SAndroid Build Coastguard Worker do { \
1838*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1839*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[4]; \
1840*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1841*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1842*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1843*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1844*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1845*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1846*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
1847*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1848*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
1849*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
1850*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
1851*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
1852*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
1853*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
1854*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1855*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
1856*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1857*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
1858*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1859*da0073e9SAndroid Build Coastguard Worker ); \
1860*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1861*da0073e9SAndroid Build Coastguard Worker } while (0)
1862*da0073e9SAndroid Build Coastguard Worker
1863*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1864*da0073e9SAndroid Build Coastguard Worker do { \
1865*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1866*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[5]; \
1867*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1868*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1869*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1870*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1871*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1872*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1873*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1874*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
1875*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1876*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
1877*da0073e9SAndroid Build Coastguard Worker "movq 32(%%rax), %%rcx\n\t" \
1878*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
1879*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
1880*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
1881*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
1882*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
1883*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1884*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
1885*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1886*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
1887*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1888*da0073e9SAndroid Build Coastguard Worker ); \
1889*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1890*da0073e9SAndroid Build Coastguard Worker } while (0)
1891*da0073e9SAndroid Build Coastguard Worker
1892*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1893*da0073e9SAndroid Build Coastguard Worker do { \
1894*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1895*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[6]; \
1896*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1897*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1898*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1899*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1900*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1901*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1902*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1903*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1904*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
1905*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1906*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
1907*da0073e9SAndroid Build Coastguard Worker "movq 40(%%rax), %%r8\n\t" \
1908*da0073e9SAndroid Build Coastguard Worker "movq 32(%%rax), %%rcx\n\t" \
1909*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
1910*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
1911*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
1912*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
1913*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
1914*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1915*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
1916*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1917*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
1918*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1919*da0073e9SAndroid Build Coastguard Worker ); \
1920*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1921*da0073e9SAndroid Build Coastguard Worker } while (0)
1922*da0073e9SAndroid Build Coastguard Worker
1923*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1924*da0073e9SAndroid Build Coastguard Worker do { \
1925*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1926*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[7]; \
1927*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1928*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1929*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1930*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1931*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1932*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1933*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1934*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
1935*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1936*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
1937*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1938*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
1939*da0073e9SAndroid Build Coastguard Worker "movq 48(%%rax), %%r9\n\t" \
1940*da0073e9SAndroid Build Coastguard Worker "movq 40(%%rax), %%r8\n\t" \
1941*da0073e9SAndroid Build Coastguard Worker "movq 32(%%rax), %%rcx\n\t" \
1942*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
1943*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
1944*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
1945*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
1946*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
1947*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1948*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
1949*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1950*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
1951*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1952*da0073e9SAndroid Build Coastguard Worker ); \
1953*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1954*da0073e9SAndroid Build Coastguard Worker } while (0)
1955*da0073e9SAndroid Build Coastguard Worker
1956*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1957*da0073e9SAndroid Build Coastguard Worker arg7) \
1958*da0073e9SAndroid Build Coastguard Worker do { \
1959*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1960*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[8]; \
1961*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1962*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1963*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
1964*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
1965*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
1966*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
1967*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
1968*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
1969*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
1970*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
1971*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
1972*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
1973*da0073e9SAndroid Build Coastguard Worker "subq $136,%%rsp\n\t" \
1974*da0073e9SAndroid Build Coastguard Worker "pushq 56(%%rax)\n\t" \
1975*da0073e9SAndroid Build Coastguard Worker "movq 48(%%rax), %%r9\n\t" \
1976*da0073e9SAndroid Build Coastguard Worker "movq 40(%%rax), %%r8\n\t" \
1977*da0073e9SAndroid Build Coastguard Worker "movq 32(%%rax), %%rcx\n\t" \
1978*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
1979*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
1980*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
1981*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
1982*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
1983*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
1984*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
1985*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
1986*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
1987*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1988*da0073e9SAndroid Build Coastguard Worker ); \
1989*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
1990*da0073e9SAndroid Build Coastguard Worker } while (0)
1991*da0073e9SAndroid Build Coastguard Worker
1992*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1993*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
1994*da0073e9SAndroid Build Coastguard Worker do { \
1995*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
1996*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[9]; \
1997*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
1998*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
1999*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
2000*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
2001*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
2002*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
2003*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
2004*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
2005*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
2006*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
2007*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2008*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
2009*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2010*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
2011*da0073e9SAndroid Build Coastguard Worker "pushq 64(%%rax)\n\t" \
2012*da0073e9SAndroid Build Coastguard Worker "pushq 56(%%rax)\n\t" \
2013*da0073e9SAndroid Build Coastguard Worker "movq 48(%%rax), %%r9\n\t" \
2014*da0073e9SAndroid Build Coastguard Worker "movq 40(%%rax), %%r8\n\t" \
2015*da0073e9SAndroid Build Coastguard Worker "movq 32(%%rax), %%rcx\n\t" \
2016*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
2017*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
2018*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
2019*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
2020*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
2021*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2022*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
2023*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
2024*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
2025*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2026*da0073e9SAndroid Build Coastguard Worker ); \
2027*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2028*da0073e9SAndroid Build Coastguard Worker } while (0)
2029*da0073e9SAndroid Build Coastguard Worker
2030*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2031*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
2032*da0073e9SAndroid Build Coastguard Worker do { \
2033*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2034*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[10]; \
2035*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2036*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2037*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
2038*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
2039*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
2040*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
2041*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
2042*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
2043*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
2044*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
2045*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
2046*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2047*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
2048*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2049*da0073e9SAndroid Build Coastguard Worker "subq $136,%%rsp\n\t" \
2050*da0073e9SAndroid Build Coastguard Worker "pushq 72(%%rax)\n\t" \
2051*da0073e9SAndroid Build Coastguard Worker "pushq 64(%%rax)\n\t" \
2052*da0073e9SAndroid Build Coastguard Worker "pushq 56(%%rax)\n\t" \
2053*da0073e9SAndroid Build Coastguard Worker "movq 48(%%rax), %%r9\n\t" \
2054*da0073e9SAndroid Build Coastguard Worker "movq 40(%%rax), %%r8\n\t" \
2055*da0073e9SAndroid Build Coastguard Worker "movq 32(%%rax), %%rcx\n\t" \
2056*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
2057*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
2058*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
2059*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
2060*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
2061*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2062*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
2063*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
2064*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
2065*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2066*da0073e9SAndroid Build Coastguard Worker ); \
2067*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2068*da0073e9SAndroid Build Coastguard Worker } while (0)
2069*da0073e9SAndroid Build Coastguard Worker
2070*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2071*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
2072*da0073e9SAndroid Build Coastguard Worker do { \
2073*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2074*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[11]; \
2075*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2076*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2077*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
2078*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
2079*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
2080*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
2081*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
2082*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
2083*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
2084*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
2085*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
2086*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
2087*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2088*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
2089*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2090*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
2091*da0073e9SAndroid Build Coastguard Worker "pushq 80(%%rax)\n\t" \
2092*da0073e9SAndroid Build Coastguard Worker "pushq 72(%%rax)\n\t" \
2093*da0073e9SAndroid Build Coastguard Worker "pushq 64(%%rax)\n\t" \
2094*da0073e9SAndroid Build Coastguard Worker "pushq 56(%%rax)\n\t" \
2095*da0073e9SAndroid Build Coastguard Worker "movq 48(%%rax), %%r9\n\t" \
2096*da0073e9SAndroid Build Coastguard Worker "movq 40(%%rax), %%r8\n\t" \
2097*da0073e9SAndroid Build Coastguard Worker "movq 32(%%rax), %%rcx\n\t" \
2098*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
2099*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
2100*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
2101*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
2102*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
2103*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2104*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
2105*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
2106*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
2107*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2108*da0073e9SAndroid Build Coastguard Worker ); \
2109*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2110*da0073e9SAndroid Build Coastguard Worker } while (0)
2111*da0073e9SAndroid Build Coastguard Worker
2112*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2113*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11) \
2114*da0073e9SAndroid Build Coastguard Worker do { \
2115*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2116*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[12]; \
2117*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2118*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2119*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
2120*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
2121*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
2122*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
2123*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
2124*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
2125*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
2126*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
2127*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
2128*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
2129*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
2130*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2131*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
2132*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2133*da0073e9SAndroid Build Coastguard Worker "subq $136,%%rsp\n\t" \
2134*da0073e9SAndroid Build Coastguard Worker "pushq 88(%%rax)\n\t" \
2135*da0073e9SAndroid Build Coastguard Worker "pushq 80(%%rax)\n\t" \
2136*da0073e9SAndroid Build Coastguard Worker "pushq 72(%%rax)\n\t" \
2137*da0073e9SAndroid Build Coastguard Worker "pushq 64(%%rax)\n\t" \
2138*da0073e9SAndroid Build Coastguard Worker "pushq 56(%%rax)\n\t" \
2139*da0073e9SAndroid Build Coastguard Worker "movq 48(%%rax), %%r9\n\t" \
2140*da0073e9SAndroid Build Coastguard Worker "movq 40(%%rax), %%r8\n\t" \
2141*da0073e9SAndroid Build Coastguard Worker "movq 32(%%rax), %%rcx\n\t" \
2142*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
2143*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
2144*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
2145*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
2146*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
2147*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2148*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
2149*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
2150*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
2151*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2152*da0073e9SAndroid Build Coastguard Worker ); \
2153*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2154*da0073e9SAndroid Build Coastguard Worker } while (0)
2155*da0073e9SAndroid Build Coastguard Worker
2156*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2157*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11,arg12) \
2158*da0073e9SAndroid Build Coastguard Worker do { \
2159*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2160*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[13]; \
2161*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2162*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2163*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
2164*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
2165*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
2166*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
2167*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
2168*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
2169*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
2170*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
2171*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
2172*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
2173*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
2174*da0073e9SAndroid Build Coastguard Worker _argvec[12] = (unsigned long)(arg12); \
2175*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2176*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
2177*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2178*da0073e9SAndroid Build Coastguard Worker "subq $128,%%rsp\n\t" \
2179*da0073e9SAndroid Build Coastguard Worker "pushq 96(%%rax)\n\t" \
2180*da0073e9SAndroid Build Coastguard Worker "pushq 88(%%rax)\n\t" \
2181*da0073e9SAndroid Build Coastguard Worker "pushq 80(%%rax)\n\t" \
2182*da0073e9SAndroid Build Coastguard Worker "pushq 72(%%rax)\n\t" \
2183*da0073e9SAndroid Build Coastguard Worker "pushq 64(%%rax)\n\t" \
2184*da0073e9SAndroid Build Coastguard Worker "pushq 56(%%rax)\n\t" \
2185*da0073e9SAndroid Build Coastguard Worker "movq 48(%%rax), %%r9\n\t" \
2186*da0073e9SAndroid Build Coastguard Worker "movq 40(%%rax), %%r8\n\t" \
2187*da0073e9SAndroid Build Coastguard Worker "movq 32(%%rax), %%rcx\n\t" \
2188*da0073e9SAndroid Build Coastguard Worker "movq 24(%%rax), %%rdx\n\t" \
2189*da0073e9SAndroid Build Coastguard Worker "movq 16(%%rax), %%rsi\n\t" \
2190*da0073e9SAndroid Build Coastguard Worker "movq 8(%%rax), %%rdi\n\t" \
2191*da0073e9SAndroid Build Coastguard Worker "movq (%%rax), %%rax\n\t" /* target->%rax */ \
2192*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_RAX \
2193*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2194*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
2195*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=a" (_res) \
2196*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
2197*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2198*da0073e9SAndroid Build Coastguard Worker ); \
2199*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2200*da0073e9SAndroid Build Coastguard Worker } while (0)
2201*da0073e9SAndroid Build Coastguard Worker
2202*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_amd64_linux || PLAT_amd64_darwin || PLAT_amd64_solaris */
2203*da0073e9SAndroid Build Coastguard Worker
2204*da0073e9SAndroid Build Coastguard Worker /* ------------------------ ppc32-linux ------------------------ */
2205*da0073e9SAndroid Build Coastguard Worker
2206*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc32_linux)
2207*da0073e9SAndroid Build Coastguard Worker
2208*da0073e9SAndroid Build Coastguard Worker /* This is useful for finding out about the on-stack stuff:
2209*da0073e9SAndroid Build Coastguard Worker
2210*da0073e9SAndroid Build Coastguard Worker extern int f9 ( int,int,int,int,int,int,int,int,int );
2211*da0073e9SAndroid Build Coastguard Worker extern int f10 ( int,int,int,int,int,int,int,int,int,int );
2212*da0073e9SAndroid Build Coastguard Worker extern int f11 ( int,int,int,int,int,int,int,int,int,int,int );
2213*da0073e9SAndroid Build Coastguard Worker extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int );
2214*da0073e9SAndroid Build Coastguard Worker
2215*da0073e9SAndroid Build Coastguard Worker int g9 ( void ) {
2216*da0073e9SAndroid Build Coastguard Worker return f9(11,22,33,44,55,66,77,88,99);
2217*da0073e9SAndroid Build Coastguard Worker }
2218*da0073e9SAndroid Build Coastguard Worker int g10 ( void ) {
2219*da0073e9SAndroid Build Coastguard Worker return f10(11,22,33,44,55,66,77,88,99,110);
2220*da0073e9SAndroid Build Coastguard Worker }
2221*da0073e9SAndroid Build Coastguard Worker int g11 ( void ) {
2222*da0073e9SAndroid Build Coastguard Worker return f11(11,22,33,44,55,66,77,88,99,110,121);
2223*da0073e9SAndroid Build Coastguard Worker }
2224*da0073e9SAndroid Build Coastguard Worker int g12 ( void ) {
2225*da0073e9SAndroid Build Coastguard Worker return f12(11,22,33,44,55,66,77,88,99,110,121,132);
2226*da0073e9SAndroid Build Coastguard Worker }
2227*da0073e9SAndroid Build Coastguard Worker */
2228*da0073e9SAndroid Build Coastguard Worker
2229*da0073e9SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
2230*da0073e9SAndroid Build Coastguard Worker
2231*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
2232*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS \
2233*da0073e9SAndroid Build Coastguard Worker "lr", "ctr", "xer", \
2234*da0073e9SAndroid Build Coastguard Worker "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2235*da0073e9SAndroid Build Coastguard Worker "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2236*da0073e9SAndroid Build Coastguard Worker "r11", "r12", "r13"
2237*da0073e9SAndroid Build Coastguard Worker
2238*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
2239*da0073e9SAndroid Build Coastguard Worker call and restore it afterwards as gcc may not keep the stack
2240*da0073e9SAndroid Build Coastguard Worker pointer aligned if it doesn't realise calls are being made
2241*da0073e9SAndroid Build Coastguard Worker to other functions. */
2242*da0073e9SAndroid Build Coastguard Worker
2243*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK \
2244*da0073e9SAndroid Build Coastguard Worker "mr 28,1\n\t" \
2245*da0073e9SAndroid Build Coastguard Worker "rlwinm 1,1,0,0,27\n\t"
2246*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK \
2247*da0073e9SAndroid Build Coastguard Worker "mr 1,28\n\t"
2248*da0073e9SAndroid Build Coastguard Worker
2249*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc32-linux,
2250*da0073e9SAndroid Build Coastguard Worker sizeof(unsigned long) == 4. */
2251*da0073e9SAndroid Build Coastguard Worker
2252*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
2253*da0073e9SAndroid Build Coastguard Worker do { \
2254*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2255*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[1]; \
2256*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2257*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2258*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2259*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2260*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2261*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2262*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2263*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2264*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2265*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2266*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2267*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2268*da0073e9SAndroid Build Coastguard Worker ); \
2269*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2270*da0073e9SAndroid Build Coastguard Worker } while (0)
2271*da0073e9SAndroid Build Coastguard Worker
2272*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
2273*da0073e9SAndroid Build Coastguard Worker do { \
2274*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2275*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[2]; \
2276*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2277*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2278*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2279*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2280*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2281*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2282*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2283*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2284*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2285*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2286*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2287*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2288*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2289*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2290*da0073e9SAndroid Build Coastguard Worker ); \
2291*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2292*da0073e9SAndroid Build Coastguard Worker } while (0)
2293*da0073e9SAndroid Build Coastguard Worker
2294*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2295*da0073e9SAndroid Build Coastguard Worker do { \
2296*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2297*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3]; \
2298*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2299*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2300*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2301*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2302*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2303*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2304*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2305*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2306*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2307*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2308*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2309*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2310*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2311*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2312*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2313*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2314*da0073e9SAndroid Build Coastguard Worker ); \
2315*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2316*da0073e9SAndroid Build Coastguard Worker } while (0)
2317*da0073e9SAndroid Build Coastguard Worker
2318*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2319*da0073e9SAndroid Build Coastguard Worker do { \
2320*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2321*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[4]; \
2322*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2323*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2324*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2325*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2326*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2327*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2328*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2329*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2330*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2331*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2332*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2333*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2334*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2335*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2336*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2337*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2338*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2339*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2340*da0073e9SAndroid Build Coastguard Worker ); \
2341*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2342*da0073e9SAndroid Build Coastguard Worker } while (0)
2343*da0073e9SAndroid Build Coastguard Worker
2344*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2345*da0073e9SAndroid Build Coastguard Worker do { \
2346*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2347*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[5]; \
2348*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2349*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2350*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2351*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2352*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2353*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
2354*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2355*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2356*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2357*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2358*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2359*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2360*da0073e9SAndroid Build Coastguard Worker "lwz 6,16(11)\n\t" /* arg4->r6 */ \
2361*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2362*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2363*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2364*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2365*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2366*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2367*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2368*da0073e9SAndroid Build Coastguard Worker ); \
2369*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2370*da0073e9SAndroid Build Coastguard Worker } while (0)
2371*da0073e9SAndroid Build Coastguard Worker
2372*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2373*da0073e9SAndroid Build Coastguard Worker do { \
2374*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2375*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[6]; \
2376*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2377*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2378*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2379*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2380*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2381*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
2382*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
2383*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2384*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2385*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2386*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2387*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2388*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2389*da0073e9SAndroid Build Coastguard Worker "lwz 6,16(11)\n\t" /* arg4->r6 */ \
2390*da0073e9SAndroid Build Coastguard Worker "lwz 7,20(11)\n\t" \
2391*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2392*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2393*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2394*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2395*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2396*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2397*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2398*da0073e9SAndroid Build Coastguard Worker ); \
2399*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2400*da0073e9SAndroid Build Coastguard Worker } while (0)
2401*da0073e9SAndroid Build Coastguard Worker
2402*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2403*da0073e9SAndroid Build Coastguard Worker do { \
2404*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2405*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[7]; \
2406*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2407*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2408*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2409*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2410*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2411*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
2412*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
2413*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
2414*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2415*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2416*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2417*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2418*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2419*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2420*da0073e9SAndroid Build Coastguard Worker "lwz 6,16(11)\n\t" /* arg4->r6 */ \
2421*da0073e9SAndroid Build Coastguard Worker "lwz 7,20(11)\n\t" \
2422*da0073e9SAndroid Build Coastguard Worker "lwz 8,24(11)\n\t" \
2423*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2424*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2425*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2426*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2427*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2428*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2429*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2430*da0073e9SAndroid Build Coastguard Worker ); \
2431*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2432*da0073e9SAndroid Build Coastguard Worker } while (0)
2433*da0073e9SAndroid Build Coastguard Worker
2434*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2435*da0073e9SAndroid Build Coastguard Worker arg7) \
2436*da0073e9SAndroid Build Coastguard Worker do { \
2437*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2438*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[8]; \
2439*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2440*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2441*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2442*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2443*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2444*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
2445*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
2446*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
2447*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
2448*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2449*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2450*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2451*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2452*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2453*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2454*da0073e9SAndroid Build Coastguard Worker "lwz 6,16(11)\n\t" /* arg4->r6 */ \
2455*da0073e9SAndroid Build Coastguard Worker "lwz 7,20(11)\n\t" \
2456*da0073e9SAndroid Build Coastguard Worker "lwz 8,24(11)\n\t" \
2457*da0073e9SAndroid Build Coastguard Worker "lwz 9,28(11)\n\t" \
2458*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2459*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2460*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2461*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2462*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2463*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2464*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2465*da0073e9SAndroid Build Coastguard Worker ); \
2466*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2467*da0073e9SAndroid Build Coastguard Worker } while (0)
2468*da0073e9SAndroid Build Coastguard Worker
2469*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2470*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
2471*da0073e9SAndroid Build Coastguard Worker do { \
2472*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2473*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[9]; \
2474*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2475*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2476*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2477*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2478*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2479*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
2480*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
2481*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
2482*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
2483*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
2484*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2485*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2486*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2487*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2488*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2489*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2490*da0073e9SAndroid Build Coastguard Worker "lwz 6,16(11)\n\t" /* arg4->r6 */ \
2491*da0073e9SAndroid Build Coastguard Worker "lwz 7,20(11)\n\t" \
2492*da0073e9SAndroid Build Coastguard Worker "lwz 8,24(11)\n\t" \
2493*da0073e9SAndroid Build Coastguard Worker "lwz 9,28(11)\n\t" \
2494*da0073e9SAndroid Build Coastguard Worker "lwz 10,32(11)\n\t" /* arg8->r10 */ \
2495*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2496*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2497*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2498*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2499*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2500*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2501*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2502*da0073e9SAndroid Build Coastguard Worker ); \
2503*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2504*da0073e9SAndroid Build Coastguard Worker } while (0)
2505*da0073e9SAndroid Build Coastguard Worker
2506*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2507*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
2508*da0073e9SAndroid Build Coastguard Worker do { \
2509*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2510*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[10]; \
2511*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2512*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2513*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2514*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2515*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2516*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
2517*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
2518*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
2519*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
2520*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
2521*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)arg9; \
2522*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2523*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2524*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2525*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-16\n\t" \
2526*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
2527*da0073e9SAndroid Build Coastguard Worker "lwz 3,36(11)\n\t" \
2528*da0073e9SAndroid Build Coastguard Worker "stw 3,8(1)\n\t" \
2529*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
2530*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2531*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2532*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2533*da0073e9SAndroid Build Coastguard Worker "lwz 6,16(11)\n\t" /* arg4->r6 */ \
2534*da0073e9SAndroid Build Coastguard Worker "lwz 7,20(11)\n\t" \
2535*da0073e9SAndroid Build Coastguard Worker "lwz 8,24(11)\n\t" \
2536*da0073e9SAndroid Build Coastguard Worker "lwz 9,28(11)\n\t" \
2537*da0073e9SAndroid Build Coastguard Worker "lwz 10,32(11)\n\t" /* arg8->r10 */ \
2538*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2539*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2540*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2541*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2542*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2543*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2544*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2545*da0073e9SAndroid Build Coastguard Worker ); \
2546*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2547*da0073e9SAndroid Build Coastguard Worker } while (0)
2548*da0073e9SAndroid Build Coastguard Worker
2549*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2550*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
2551*da0073e9SAndroid Build Coastguard Worker do { \
2552*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2553*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[11]; \
2554*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2555*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2556*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2557*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2558*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2559*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
2560*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
2561*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
2562*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
2563*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
2564*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)arg9; \
2565*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)arg10; \
2566*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2567*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2568*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2569*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-16\n\t" \
2570*da0073e9SAndroid Build Coastguard Worker /* arg10 */ \
2571*da0073e9SAndroid Build Coastguard Worker "lwz 3,40(11)\n\t" \
2572*da0073e9SAndroid Build Coastguard Worker "stw 3,12(1)\n\t" \
2573*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
2574*da0073e9SAndroid Build Coastguard Worker "lwz 3,36(11)\n\t" \
2575*da0073e9SAndroid Build Coastguard Worker "stw 3,8(1)\n\t" \
2576*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
2577*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2578*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2579*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2580*da0073e9SAndroid Build Coastguard Worker "lwz 6,16(11)\n\t" /* arg4->r6 */ \
2581*da0073e9SAndroid Build Coastguard Worker "lwz 7,20(11)\n\t" \
2582*da0073e9SAndroid Build Coastguard Worker "lwz 8,24(11)\n\t" \
2583*da0073e9SAndroid Build Coastguard Worker "lwz 9,28(11)\n\t" \
2584*da0073e9SAndroid Build Coastguard Worker "lwz 10,32(11)\n\t" /* arg8->r10 */ \
2585*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2586*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2587*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2588*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2589*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2590*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2591*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2592*da0073e9SAndroid Build Coastguard Worker ); \
2593*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2594*da0073e9SAndroid Build Coastguard Worker } while (0)
2595*da0073e9SAndroid Build Coastguard Worker
2596*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2597*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11) \
2598*da0073e9SAndroid Build Coastguard Worker do { \
2599*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2600*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[12]; \
2601*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2602*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2603*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2604*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2605*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2606*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
2607*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
2608*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
2609*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
2610*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
2611*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)arg9; \
2612*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)arg10; \
2613*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)arg11; \
2614*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2615*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2616*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2617*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-32\n\t" \
2618*da0073e9SAndroid Build Coastguard Worker /* arg11 */ \
2619*da0073e9SAndroid Build Coastguard Worker "lwz 3,44(11)\n\t" \
2620*da0073e9SAndroid Build Coastguard Worker "stw 3,16(1)\n\t" \
2621*da0073e9SAndroid Build Coastguard Worker /* arg10 */ \
2622*da0073e9SAndroid Build Coastguard Worker "lwz 3,40(11)\n\t" \
2623*da0073e9SAndroid Build Coastguard Worker "stw 3,12(1)\n\t" \
2624*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
2625*da0073e9SAndroid Build Coastguard Worker "lwz 3,36(11)\n\t" \
2626*da0073e9SAndroid Build Coastguard Worker "stw 3,8(1)\n\t" \
2627*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
2628*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2629*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2630*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2631*da0073e9SAndroid Build Coastguard Worker "lwz 6,16(11)\n\t" /* arg4->r6 */ \
2632*da0073e9SAndroid Build Coastguard Worker "lwz 7,20(11)\n\t" \
2633*da0073e9SAndroid Build Coastguard Worker "lwz 8,24(11)\n\t" \
2634*da0073e9SAndroid Build Coastguard Worker "lwz 9,28(11)\n\t" \
2635*da0073e9SAndroid Build Coastguard Worker "lwz 10,32(11)\n\t" /* arg8->r10 */ \
2636*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2637*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2638*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2639*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2640*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2641*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2642*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2643*da0073e9SAndroid Build Coastguard Worker ); \
2644*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2645*da0073e9SAndroid Build Coastguard Worker } while (0)
2646*da0073e9SAndroid Build Coastguard Worker
2647*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2648*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11,arg12) \
2649*da0073e9SAndroid Build Coastguard Worker do { \
2650*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2651*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[13]; \
2652*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2653*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
2654*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
2655*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
2656*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
2657*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
2658*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
2659*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
2660*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
2661*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
2662*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)arg9; \
2663*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)arg10; \
2664*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)arg11; \
2665*da0073e9SAndroid Build Coastguard Worker _argvec[12] = (unsigned long)arg12; \
2666*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2667*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2668*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2669*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-32\n\t" \
2670*da0073e9SAndroid Build Coastguard Worker /* arg12 */ \
2671*da0073e9SAndroid Build Coastguard Worker "lwz 3,48(11)\n\t" \
2672*da0073e9SAndroid Build Coastguard Worker "stw 3,20(1)\n\t" \
2673*da0073e9SAndroid Build Coastguard Worker /* arg11 */ \
2674*da0073e9SAndroid Build Coastguard Worker "lwz 3,44(11)\n\t" \
2675*da0073e9SAndroid Build Coastguard Worker "stw 3,16(1)\n\t" \
2676*da0073e9SAndroid Build Coastguard Worker /* arg10 */ \
2677*da0073e9SAndroid Build Coastguard Worker "lwz 3,40(11)\n\t" \
2678*da0073e9SAndroid Build Coastguard Worker "stw 3,12(1)\n\t" \
2679*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
2680*da0073e9SAndroid Build Coastguard Worker "lwz 3,36(11)\n\t" \
2681*da0073e9SAndroid Build Coastguard Worker "stw 3,8(1)\n\t" \
2682*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
2683*da0073e9SAndroid Build Coastguard Worker "lwz 3,4(11)\n\t" /* arg1->r3 */ \
2684*da0073e9SAndroid Build Coastguard Worker "lwz 4,8(11)\n\t" \
2685*da0073e9SAndroid Build Coastguard Worker "lwz 5,12(11)\n\t" \
2686*da0073e9SAndroid Build Coastguard Worker "lwz 6,16(11)\n\t" /* arg4->r6 */ \
2687*da0073e9SAndroid Build Coastguard Worker "lwz 7,20(11)\n\t" \
2688*da0073e9SAndroid Build Coastguard Worker "lwz 8,24(11)\n\t" \
2689*da0073e9SAndroid Build Coastguard Worker "lwz 9,28(11)\n\t" \
2690*da0073e9SAndroid Build Coastguard Worker "lwz 10,32(11)\n\t" /* arg8->r10 */ \
2691*da0073e9SAndroid Build Coastguard Worker "lwz 11,0(11)\n\t" /* target->r11 */ \
2692*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2693*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2694*da0073e9SAndroid Build Coastguard Worker "mr %0,3" \
2695*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2696*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
2697*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2698*da0073e9SAndroid Build Coastguard Worker ); \
2699*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2700*da0073e9SAndroid Build Coastguard Worker } while (0)
2701*da0073e9SAndroid Build Coastguard Worker
2702*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc32_linux */
2703*da0073e9SAndroid Build Coastguard Worker
2704*da0073e9SAndroid Build Coastguard Worker /* ------------------------ ppc64-linux ------------------------ */
2705*da0073e9SAndroid Build Coastguard Worker
2706*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc64be_linux)
2707*da0073e9SAndroid Build Coastguard Worker
2708*da0073e9SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
2709*da0073e9SAndroid Build Coastguard Worker
2710*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
2711*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS \
2712*da0073e9SAndroid Build Coastguard Worker "lr", "ctr", "xer", \
2713*da0073e9SAndroid Build Coastguard Worker "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2714*da0073e9SAndroid Build Coastguard Worker "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2715*da0073e9SAndroid Build Coastguard Worker "r11", "r12", "r13"
2716*da0073e9SAndroid Build Coastguard Worker
2717*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
2718*da0073e9SAndroid Build Coastguard Worker call and restore it afterwards as gcc may not keep the stack
2719*da0073e9SAndroid Build Coastguard Worker pointer aligned if it doesn't realise calls are being made
2720*da0073e9SAndroid Build Coastguard Worker to other functions. */
2721*da0073e9SAndroid Build Coastguard Worker
2722*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK \
2723*da0073e9SAndroid Build Coastguard Worker "mr 28,1\n\t" \
2724*da0073e9SAndroid Build Coastguard Worker "rldicr 1,1,0,59\n\t"
2725*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK \
2726*da0073e9SAndroid Build Coastguard Worker "mr 1,28\n\t"
2727*da0073e9SAndroid Build Coastguard Worker
2728*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
2729*da0073e9SAndroid Build Coastguard Worker long) == 8. */
2730*da0073e9SAndroid Build Coastguard Worker
2731*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
2732*da0073e9SAndroid Build Coastguard Worker do { \
2733*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2734*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+0]; \
2735*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2736*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
2737*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
2738*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
2739*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2740*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2741*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2742*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
2743*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
2744*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
2745*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2746*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2747*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
2748*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
2749*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2750*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2751*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
2752*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2753*da0073e9SAndroid Build Coastguard Worker ); \
2754*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2755*da0073e9SAndroid Build Coastguard Worker } while (0)
2756*da0073e9SAndroid Build Coastguard Worker
2757*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
2758*da0073e9SAndroid Build Coastguard Worker do { \
2759*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2760*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+1]; \
2761*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2762*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
2763*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
2764*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
2765*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
2766*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2767*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2768*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2769*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
2770*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
2771*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
2772*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
2773*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2774*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2775*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
2776*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
2777*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2778*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2779*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
2780*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2781*da0073e9SAndroid Build Coastguard Worker ); \
2782*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2783*da0073e9SAndroid Build Coastguard Worker } while (0)
2784*da0073e9SAndroid Build Coastguard Worker
2785*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2786*da0073e9SAndroid Build Coastguard Worker do { \
2787*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2788*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+2]; \
2789*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2790*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
2791*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
2792*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
2793*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
2794*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
2795*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2796*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2797*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2798*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
2799*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
2800*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
2801*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
2802*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
2803*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2804*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2805*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
2806*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
2807*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2808*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2809*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
2810*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2811*da0073e9SAndroid Build Coastguard Worker ); \
2812*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2813*da0073e9SAndroid Build Coastguard Worker } while (0)
2814*da0073e9SAndroid Build Coastguard Worker
2815*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2816*da0073e9SAndroid Build Coastguard Worker do { \
2817*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2818*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+3]; \
2819*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2820*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
2821*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
2822*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
2823*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
2824*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
2825*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
2826*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2827*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2828*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2829*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
2830*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
2831*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
2832*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
2833*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
2834*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
2835*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2836*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2837*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
2838*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
2839*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2840*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2841*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
2842*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2843*da0073e9SAndroid Build Coastguard Worker ); \
2844*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2845*da0073e9SAndroid Build Coastguard Worker } while (0)
2846*da0073e9SAndroid Build Coastguard Worker
2847*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2848*da0073e9SAndroid Build Coastguard Worker do { \
2849*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2850*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+4]; \
2851*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2852*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
2853*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
2854*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
2855*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
2856*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
2857*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
2858*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
2859*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2860*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2861*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2862*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
2863*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
2864*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
2865*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
2866*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
2867*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(11)\n\t" /* arg4->r6 */ \
2868*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
2869*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2870*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2871*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
2872*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
2873*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2874*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2875*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
2876*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2877*da0073e9SAndroid Build Coastguard Worker ); \
2878*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2879*da0073e9SAndroid Build Coastguard Worker } while (0)
2880*da0073e9SAndroid Build Coastguard Worker
2881*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2882*da0073e9SAndroid Build Coastguard Worker do { \
2883*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2884*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+5]; \
2885*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2886*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
2887*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
2888*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
2889*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
2890*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
2891*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
2892*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
2893*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
2894*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2895*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2896*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2897*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
2898*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
2899*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
2900*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
2901*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
2902*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(11)\n\t" /* arg4->r6 */ \
2903*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(11)\n\t" /* arg5->r7 */ \
2904*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
2905*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2906*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2907*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
2908*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
2909*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2910*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2911*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
2912*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2913*da0073e9SAndroid Build Coastguard Worker ); \
2914*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2915*da0073e9SAndroid Build Coastguard Worker } while (0)
2916*da0073e9SAndroid Build Coastguard Worker
2917*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2918*da0073e9SAndroid Build Coastguard Worker do { \
2919*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2920*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+6]; \
2921*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2922*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
2923*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
2924*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
2925*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
2926*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
2927*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
2928*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
2929*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
2930*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
2931*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2932*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2933*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2934*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
2935*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
2936*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
2937*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
2938*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
2939*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(11)\n\t" /* arg4->r6 */ \
2940*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(11)\n\t" /* arg5->r7 */ \
2941*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(11)\n\t" /* arg6->r8 */ \
2942*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
2943*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2944*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2945*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
2946*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
2947*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2948*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2949*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
2950*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2951*da0073e9SAndroid Build Coastguard Worker ); \
2952*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2953*da0073e9SAndroid Build Coastguard Worker } while (0)
2954*da0073e9SAndroid Build Coastguard Worker
2955*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2956*da0073e9SAndroid Build Coastguard Worker arg7) \
2957*da0073e9SAndroid Build Coastguard Worker do { \
2958*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
2959*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+7]; \
2960*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
2961*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
2962*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
2963*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
2964*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
2965*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
2966*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
2967*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
2968*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
2969*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
2970*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
2971*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
2972*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
2973*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2974*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
2975*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
2976*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
2977*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
2978*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
2979*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(11)\n\t" /* arg4->r6 */ \
2980*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(11)\n\t" /* arg5->r7 */ \
2981*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(11)\n\t" /* arg6->r8 */ \
2982*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(11)\n\t" /* arg7->r9 */ \
2983*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
2984*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2985*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
2986*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
2987*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
2988*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
2989*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
2990*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
2991*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2992*da0073e9SAndroid Build Coastguard Worker ); \
2993*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
2994*da0073e9SAndroid Build Coastguard Worker } while (0)
2995*da0073e9SAndroid Build Coastguard Worker
2996*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2997*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
2998*da0073e9SAndroid Build Coastguard Worker do { \
2999*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3000*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+8]; \
3001*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3002*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3003*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3004*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3005*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3006*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3007*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3008*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3009*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3010*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3011*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3012*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3013*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3014*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3015*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3016*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
3017*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
3018*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
3019*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
3020*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
3021*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(11)\n\t" /* arg4->r6 */ \
3022*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(11)\n\t" /* arg5->r7 */ \
3023*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(11)\n\t" /* arg6->r8 */ \
3024*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(11)\n\t" /* arg7->r9 */ \
3025*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(11)\n\t" /* arg8->r10 */ \
3026*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
3027*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3028*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3029*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3030*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
3031*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3032*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3033*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3034*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3035*da0073e9SAndroid Build Coastguard Worker ); \
3036*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3037*da0073e9SAndroid Build Coastguard Worker } while (0)
3038*da0073e9SAndroid Build Coastguard Worker
3039*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3040*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
3041*da0073e9SAndroid Build Coastguard Worker do { \
3042*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3043*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+9]; \
3044*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3045*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3046*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3047*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3048*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3049*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3050*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3051*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3052*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3053*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3054*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3055*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3056*da0073e9SAndroid Build Coastguard Worker _argvec[2+9] = (unsigned long)arg9; \
3057*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3058*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3059*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3060*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
3061*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
3062*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-128\n\t" /* expand stack frame */ \
3063*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
3064*da0073e9SAndroid Build Coastguard Worker "ld 3,72(11)\n\t" \
3065*da0073e9SAndroid Build Coastguard Worker "std 3,112(1)\n\t" \
3066*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
3067*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
3068*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
3069*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
3070*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(11)\n\t" /* arg4->r6 */ \
3071*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(11)\n\t" /* arg5->r7 */ \
3072*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(11)\n\t" /* arg6->r8 */ \
3073*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(11)\n\t" /* arg7->r9 */ \
3074*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(11)\n\t" /* arg8->r10 */ \
3075*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
3076*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3077*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3078*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3079*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
3080*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3081*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3082*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3083*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3084*da0073e9SAndroid Build Coastguard Worker ); \
3085*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3086*da0073e9SAndroid Build Coastguard Worker } while (0)
3087*da0073e9SAndroid Build Coastguard Worker
3088*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3089*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
3090*da0073e9SAndroid Build Coastguard Worker do { \
3091*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3092*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+10]; \
3093*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3094*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3095*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3096*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3097*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3098*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3099*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3100*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3101*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3102*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3103*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3104*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3105*da0073e9SAndroid Build Coastguard Worker _argvec[2+9] = (unsigned long)arg9; \
3106*da0073e9SAndroid Build Coastguard Worker _argvec[2+10] = (unsigned long)arg10; \
3107*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3108*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3109*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3110*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
3111*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
3112*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-128\n\t" /* expand stack frame */ \
3113*da0073e9SAndroid Build Coastguard Worker /* arg10 */ \
3114*da0073e9SAndroid Build Coastguard Worker "ld 3,80(11)\n\t" \
3115*da0073e9SAndroid Build Coastguard Worker "std 3,120(1)\n\t" \
3116*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
3117*da0073e9SAndroid Build Coastguard Worker "ld 3,72(11)\n\t" \
3118*da0073e9SAndroid Build Coastguard Worker "std 3,112(1)\n\t" \
3119*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
3120*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
3121*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
3122*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
3123*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(11)\n\t" /* arg4->r6 */ \
3124*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(11)\n\t" /* arg5->r7 */ \
3125*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(11)\n\t" /* arg6->r8 */ \
3126*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(11)\n\t" /* arg7->r9 */ \
3127*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(11)\n\t" /* arg8->r10 */ \
3128*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
3129*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3130*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3131*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3132*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
3133*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3134*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3135*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3136*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3137*da0073e9SAndroid Build Coastguard Worker ); \
3138*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3139*da0073e9SAndroid Build Coastguard Worker } while (0)
3140*da0073e9SAndroid Build Coastguard Worker
3141*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3142*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11) \
3143*da0073e9SAndroid Build Coastguard Worker do { \
3144*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3145*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+11]; \
3146*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3147*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3148*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3149*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3150*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3151*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3152*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3153*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3154*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3155*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3156*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3157*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3158*da0073e9SAndroid Build Coastguard Worker _argvec[2+9] = (unsigned long)arg9; \
3159*da0073e9SAndroid Build Coastguard Worker _argvec[2+10] = (unsigned long)arg10; \
3160*da0073e9SAndroid Build Coastguard Worker _argvec[2+11] = (unsigned long)arg11; \
3161*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3162*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3163*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3164*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
3165*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
3166*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-144\n\t" /* expand stack frame */ \
3167*da0073e9SAndroid Build Coastguard Worker /* arg11 */ \
3168*da0073e9SAndroid Build Coastguard Worker "ld 3,88(11)\n\t" \
3169*da0073e9SAndroid Build Coastguard Worker "std 3,128(1)\n\t" \
3170*da0073e9SAndroid Build Coastguard Worker /* arg10 */ \
3171*da0073e9SAndroid Build Coastguard Worker "ld 3,80(11)\n\t" \
3172*da0073e9SAndroid Build Coastguard Worker "std 3,120(1)\n\t" \
3173*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
3174*da0073e9SAndroid Build Coastguard Worker "ld 3,72(11)\n\t" \
3175*da0073e9SAndroid Build Coastguard Worker "std 3,112(1)\n\t" \
3176*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
3177*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
3178*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
3179*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
3180*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(11)\n\t" /* arg4->r6 */ \
3181*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(11)\n\t" /* arg5->r7 */ \
3182*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(11)\n\t" /* arg6->r8 */ \
3183*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(11)\n\t" /* arg7->r9 */ \
3184*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(11)\n\t" /* arg8->r10 */ \
3185*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
3186*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3187*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3188*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3189*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
3190*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3191*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3192*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3193*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3194*da0073e9SAndroid Build Coastguard Worker ); \
3195*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3196*da0073e9SAndroid Build Coastguard Worker } while (0)
3197*da0073e9SAndroid Build Coastguard Worker
3198*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3199*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11,arg12) \
3200*da0073e9SAndroid Build Coastguard Worker do { \
3201*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3202*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+12]; \
3203*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3204*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3205*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3206*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3207*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3208*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3209*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3210*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3211*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3212*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3213*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3214*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3215*da0073e9SAndroid Build Coastguard Worker _argvec[2+9] = (unsigned long)arg9; \
3216*da0073e9SAndroid Build Coastguard Worker _argvec[2+10] = (unsigned long)arg10; \
3217*da0073e9SAndroid Build Coastguard Worker _argvec[2+11] = (unsigned long)arg11; \
3218*da0073e9SAndroid Build Coastguard Worker _argvec[2+12] = (unsigned long)arg12; \
3219*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3220*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3221*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3222*da0073e9SAndroid Build Coastguard Worker "std 2,-16(11)\n\t" /* save tocptr */ \
3223*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
3224*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-144\n\t" /* expand stack frame */ \
3225*da0073e9SAndroid Build Coastguard Worker /* arg12 */ \
3226*da0073e9SAndroid Build Coastguard Worker "ld 3,96(11)\n\t" \
3227*da0073e9SAndroid Build Coastguard Worker "std 3,136(1)\n\t" \
3228*da0073e9SAndroid Build Coastguard Worker /* arg11 */ \
3229*da0073e9SAndroid Build Coastguard Worker "ld 3,88(11)\n\t" \
3230*da0073e9SAndroid Build Coastguard Worker "std 3,128(1)\n\t" \
3231*da0073e9SAndroid Build Coastguard Worker /* arg10 */ \
3232*da0073e9SAndroid Build Coastguard Worker "ld 3,80(11)\n\t" \
3233*da0073e9SAndroid Build Coastguard Worker "std 3,120(1)\n\t" \
3234*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
3235*da0073e9SAndroid Build Coastguard Worker "ld 3,72(11)\n\t" \
3236*da0073e9SAndroid Build Coastguard Worker "std 3,112(1)\n\t" \
3237*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
3238*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(11)\n\t" /* arg1->r3 */ \
3239*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(11)\n\t" /* arg2->r4 */ \
3240*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(11)\n\t" /* arg3->r5 */ \
3241*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(11)\n\t" /* arg4->r6 */ \
3242*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(11)\n\t" /* arg5->r7 */ \
3243*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(11)\n\t" /* arg6->r8 */ \
3244*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(11)\n\t" /* arg7->r9 */ \
3245*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(11)\n\t" /* arg8->r10 */ \
3246*da0073e9SAndroid Build Coastguard Worker "ld 11, 0(11)\n\t" /* target->r11 */ \
3247*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3248*da0073e9SAndroid Build Coastguard Worker "mr 11,%1\n\t" \
3249*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3250*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(11)\n\t" /* restore tocptr */ \
3251*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3252*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3253*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3254*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3255*da0073e9SAndroid Build Coastguard Worker ); \
3256*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3257*da0073e9SAndroid Build Coastguard Worker } while (0)
3258*da0073e9SAndroid Build Coastguard Worker
3259*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc64be_linux */
3260*da0073e9SAndroid Build Coastguard Worker
3261*da0073e9SAndroid Build Coastguard Worker /* ------------------------- ppc64le-linux ----------------------- */
3262*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_ppc64le_linux)
3263*da0073e9SAndroid Build Coastguard Worker
3264*da0073e9SAndroid Build Coastguard Worker /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
3265*da0073e9SAndroid Build Coastguard Worker
3266*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
3267*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS \
3268*da0073e9SAndroid Build Coastguard Worker "lr", "ctr", "xer", \
3269*da0073e9SAndroid Build Coastguard Worker "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
3270*da0073e9SAndroid Build Coastguard Worker "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
3271*da0073e9SAndroid Build Coastguard Worker "r11", "r12", "r13"
3272*da0073e9SAndroid Build Coastguard Worker
3273*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
3274*da0073e9SAndroid Build Coastguard Worker call and restore it afterwards as gcc may not keep the stack
3275*da0073e9SAndroid Build Coastguard Worker pointer aligned if it doesn't realise calls are being made
3276*da0073e9SAndroid Build Coastguard Worker to other functions. */
3277*da0073e9SAndroid Build Coastguard Worker
3278*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK \
3279*da0073e9SAndroid Build Coastguard Worker "mr 28,1\n\t" \
3280*da0073e9SAndroid Build Coastguard Worker "rldicr 1,1,0,59\n\t"
3281*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK \
3282*da0073e9SAndroid Build Coastguard Worker "mr 1,28\n\t"
3283*da0073e9SAndroid Build Coastguard Worker
3284*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
3285*da0073e9SAndroid Build Coastguard Worker long) == 8. */
3286*da0073e9SAndroid Build Coastguard Worker
3287*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
3288*da0073e9SAndroid Build Coastguard Worker do { \
3289*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3290*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+0]; \
3291*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3292*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3293*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3294*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3295*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3296*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3297*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3298*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3299*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3300*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3301*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3302*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3303*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3304*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3305*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3306*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3307*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3308*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3309*da0073e9SAndroid Build Coastguard Worker ); \
3310*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3311*da0073e9SAndroid Build Coastguard Worker } while (0)
3312*da0073e9SAndroid Build Coastguard Worker
3313*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
3314*da0073e9SAndroid Build Coastguard Worker do { \
3315*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3316*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+1]; \
3317*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3318*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3319*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3320*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3321*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3322*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3323*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3324*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3325*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3326*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3327*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3328*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3329*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3330*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3331*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3332*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3333*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3334*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3335*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3336*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3337*da0073e9SAndroid Build Coastguard Worker ); \
3338*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3339*da0073e9SAndroid Build Coastguard Worker } while (0)
3340*da0073e9SAndroid Build Coastguard Worker
3341*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
3342*da0073e9SAndroid Build Coastguard Worker do { \
3343*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3344*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+2]; \
3345*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3346*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3347*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3348*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3349*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3350*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3351*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3352*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3353*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3354*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3355*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3356*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3357*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3358*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3359*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3360*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3361*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3362*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3363*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3364*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3365*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3366*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3367*da0073e9SAndroid Build Coastguard Worker ); \
3368*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3369*da0073e9SAndroid Build Coastguard Worker } while (0)
3370*da0073e9SAndroid Build Coastguard Worker
3371*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
3372*da0073e9SAndroid Build Coastguard Worker do { \
3373*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3374*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+3]; \
3375*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3376*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3377*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3378*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3379*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3380*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3381*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3382*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3383*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3384*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3385*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3386*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3387*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3388*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3389*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3390*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3391*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3392*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3393*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3394*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3395*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3396*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3397*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3398*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3399*da0073e9SAndroid Build Coastguard Worker ); \
3400*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3401*da0073e9SAndroid Build Coastguard Worker } while (0)
3402*da0073e9SAndroid Build Coastguard Worker
3403*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
3404*da0073e9SAndroid Build Coastguard Worker do { \
3405*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3406*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+4]; \
3407*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3408*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3409*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3410*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3411*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3412*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3413*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3414*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3415*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3416*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3417*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3418*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3419*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3420*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3421*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3422*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3423*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(12)\n\t" /* arg4->r6 */ \
3424*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3425*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3426*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3427*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3428*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3429*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3430*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3431*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3432*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3433*da0073e9SAndroid Build Coastguard Worker ); \
3434*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3435*da0073e9SAndroid Build Coastguard Worker } while (0)
3436*da0073e9SAndroid Build Coastguard Worker
3437*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
3438*da0073e9SAndroid Build Coastguard Worker do { \
3439*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3440*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+5]; \
3441*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3442*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3443*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3444*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3445*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3446*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3447*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3448*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3449*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3450*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3451*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3452*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3453*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3454*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3455*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3456*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3457*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3458*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(12)\n\t" /* arg4->r6 */ \
3459*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(12)\n\t" /* arg5->r7 */ \
3460*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3461*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3462*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3463*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3464*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3465*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3466*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3467*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3468*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3469*da0073e9SAndroid Build Coastguard Worker ); \
3470*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3471*da0073e9SAndroid Build Coastguard Worker } while (0)
3472*da0073e9SAndroid Build Coastguard Worker
3473*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
3474*da0073e9SAndroid Build Coastguard Worker do { \
3475*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3476*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+6]; \
3477*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3478*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3479*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3480*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3481*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3482*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3483*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3484*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3485*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3486*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3487*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3488*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3489*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3490*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3491*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3492*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3493*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3494*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3495*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(12)\n\t" /* arg4->r6 */ \
3496*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(12)\n\t" /* arg5->r7 */ \
3497*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(12)\n\t" /* arg6->r8 */ \
3498*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3499*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3500*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3501*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3502*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3503*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3504*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3505*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3506*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3507*da0073e9SAndroid Build Coastguard Worker ); \
3508*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3509*da0073e9SAndroid Build Coastguard Worker } while (0)
3510*da0073e9SAndroid Build Coastguard Worker
3511*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3512*da0073e9SAndroid Build Coastguard Worker arg7) \
3513*da0073e9SAndroid Build Coastguard Worker do { \
3514*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3515*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+7]; \
3516*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3517*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3518*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3519*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3520*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3521*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3522*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3523*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3524*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3525*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3526*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3527*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3528*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3529*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3530*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3531*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3532*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3533*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3534*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3535*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(12)\n\t" /* arg4->r6 */ \
3536*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(12)\n\t" /* arg5->r7 */ \
3537*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(12)\n\t" /* arg6->r8 */ \
3538*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(12)\n\t" /* arg7->r9 */ \
3539*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3540*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3541*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3542*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3543*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3544*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3545*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3546*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3547*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3548*da0073e9SAndroid Build Coastguard Worker ); \
3549*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3550*da0073e9SAndroid Build Coastguard Worker } while (0)
3551*da0073e9SAndroid Build Coastguard Worker
3552*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3553*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
3554*da0073e9SAndroid Build Coastguard Worker do { \
3555*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3556*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+8]; \
3557*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3558*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3559*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3560*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3561*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3562*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3563*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3564*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3565*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3566*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3567*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3568*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3569*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3570*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3571*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3572*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3573*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3574*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3575*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3576*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3577*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(12)\n\t" /* arg4->r6 */ \
3578*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(12)\n\t" /* arg5->r7 */ \
3579*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(12)\n\t" /* arg6->r8 */ \
3580*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(12)\n\t" /* arg7->r9 */ \
3581*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(12)\n\t" /* arg8->r10 */ \
3582*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3583*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3584*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3585*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3586*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3587*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3588*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3589*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3590*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3591*da0073e9SAndroid Build Coastguard Worker ); \
3592*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3593*da0073e9SAndroid Build Coastguard Worker } while (0)
3594*da0073e9SAndroid Build Coastguard Worker
3595*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3596*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
3597*da0073e9SAndroid Build Coastguard Worker do { \
3598*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3599*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+9]; \
3600*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3601*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3602*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3603*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3604*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3605*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3606*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3607*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3608*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3609*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3610*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3611*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3612*da0073e9SAndroid Build Coastguard Worker _argvec[2+9] = (unsigned long)arg9; \
3613*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3614*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3615*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3616*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3617*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3618*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-128\n\t" /* expand stack frame */ \
3619*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
3620*da0073e9SAndroid Build Coastguard Worker "ld 3,72(12)\n\t" \
3621*da0073e9SAndroid Build Coastguard Worker "std 3,96(1)\n\t" \
3622*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
3623*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3624*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3625*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3626*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(12)\n\t" /* arg4->r6 */ \
3627*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(12)\n\t" /* arg5->r7 */ \
3628*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(12)\n\t" /* arg6->r8 */ \
3629*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(12)\n\t" /* arg7->r9 */ \
3630*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(12)\n\t" /* arg8->r10 */ \
3631*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3632*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3633*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3634*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3635*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3636*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3637*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3638*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3639*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3640*da0073e9SAndroid Build Coastguard Worker ); \
3641*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3642*da0073e9SAndroid Build Coastguard Worker } while (0)
3643*da0073e9SAndroid Build Coastguard Worker
3644*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3645*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
3646*da0073e9SAndroid Build Coastguard Worker do { \
3647*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3648*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+10]; \
3649*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3650*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3651*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3652*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3653*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3654*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3655*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3656*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3657*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3658*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3659*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3660*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3661*da0073e9SAndroid Build Coastguard Worker _argvec[2+9] = (unsigned long)arg9; \
3662*da0073e9SAndroid Build Coastguard Worker _argvec[2+10] = (unsigned long)arg10; \
3663*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3664*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3665*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3666*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3667*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3668*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-128\n\t" /* expand stack frame */ \
3669*da0073e9SAndroid Build Coastguard Worker /* arg10 */ \
3670*da0073e9SAndroid Build Coastguard Worker "ld 3,80(12)\n\t" \
3671*da0073e9SAndroid Build Coastguard Worker "std 3,104(1)\n\t" \
3672*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
3673*da0073e9SAndroid Build Coastguard Worker "ld 3,72(12)\n\t" \
3674*da0073e9SAndroid Build Coastguard Worker "std 3,96(1)\n\t" \
3675*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
3676*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3677*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3678*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3679*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(12)\n\t" /* arg4->r6 */ \
3680*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(12)\n\t" /* arg5->r7 */ \
3681*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(12)\n\t" /* arg6->r8 */ \
3682*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(12)\n\t" /* arg7->r9 */ \
3683*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(12)\n\t" /* arg8->r10 */ \
3684*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3685*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3686*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3687*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3688*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3689*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3690*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3691*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3692*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3693*da0073e9SAndroid Build Coastguard Worker ); \
3694*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3695*da0073e9SAndroid Build Coastguard Worker } while (0)
3696*da0073e9SAndroid Build Coastguard Worker
3697*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3698*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11) \
3699*da0073e9SAndroid Build Coastguard Worker do { \
3700*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3701*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+11]; \
3702*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3703*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3704*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3705*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3706*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3707*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3708*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3709*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3710*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3711*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3712*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3713*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3714*da0073e9SAndroid Build Coastguard Worker _argvec[2+9] = (unsigned long)arg9; \
3715*da0073e9SAndroid Build Coastguard Worker _argvec[2+10] = (unsigned long)arg10; \
3716*da0073e9SAndroid Build Coastguard Worker _argvec[2+11] = (unsigned long)arg11; \
3717*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3718*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3719*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3720*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3721*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3722*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-144\n\t" /* expand stack frame */ \
3723*da0073e9SAndroid Build Coastguard Worker /* arg11 */ \
3724*da0073e9SAndroid Build Coastguard Worker "ld 3,88(12)\n\t" \
3725*da0073e9SAndroid Build Coastguard Worker "std 3,112(1)\n\t" \
3726*da0073e9SAndroid Build Coastguard Worker /* arg10 */ \
3727*da0073e9SAndroid Build Coastguard Worker "ld 3,80(12)\n\t" \
3728*da0073e9SAndroid Build Coastguard Worker "std 3,104(1)\n\t" \
3729*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
3730*da0073e9SAndroid Build Coastguard Worker "ld 3,72(12)\n\t" \
3731*da0073e9SAndroid Build Coastguard Worker "std 3,96(1)\n\t" \
3732*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
3733*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3734*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3735*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3736*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(12)\n\t" /* arg4->r6 */ \
3737*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(12)\n\t" /* arg5->r7 */ \
3738*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(12)\n\t" /* arg6->r8 */ \
3739*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(12)\n\t" /* arg7->r9 */ \
3740*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(12)\n\t" /* arg8->r10 */ \
3741*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3742*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3743*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3744*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3745*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3746*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3747*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3748*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3749*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3750*da0073e9SAndroid Build Coastguard Worker ); \
3751*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3752*da0073e9SAndroid Build Coastguard Worker } while (0)
3753*da0073e9SAndroid Build Coastguard Worker
3754*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3755*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11,arg12) \
3756*da0073e9SAndroid Build Coastguard Worker do { \
3757*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3758*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3+12]; \
3759*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3760*da0073e9SAndroid Build Coastguard Worker /* _argvec[0] holds current r2 across the call */ \
3761*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)_orig.r2; \
3762*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)_orig.nraddr; \
3763*da0073e9SAndroid Build Coastguard Worker _argvec[2+1] = (unsigned long)arg1; \
3764*da0073e9SAndroid Build Coastguard Worker _argvec[2+2] = (unsigned long)arg2; \
3765*da0073e9SAndroid Build Coastguard Worker _argvec[2+3] = (unsigned long)arg3; \
3766*da0073e9SAndroid Build Coastguard Worker _argvec[2+4] = (unsigned long)arg4; \
3767*da0073e9SAndroid Build Coastguard Worker _argvec[2+5] = (unsigned long)arg5; \
3768*da0073e9SAndroid Build Coastguard Worker _argvec[2+6] = (unsigned long)arg6; \
3769*da0073e9SAndroid Build Coastguard Worker _argvec[2+7] = (unsigned long)arg7; \
3770*da0073e9SAndroid Build Coastguard Worker _argvec[2+8] = (unsigned long)arg8; \
3771*da0073e9SAndroid Build Coastguard Worker _argvec[2+9] = (unsigned long)arg9; \
3772*da0073e9SAndroid Build Coastguard Worker _argvec[2+10] = (unsigned long)arg10; \
3773*da0073e9SAndroid Build Coastguard Worker _argvec[2+11] = (unsigned long)arg11; \
3774*da0073e9SAndroid Build Coastguard Worker _argvec[2+12] = (unsigned long)arg12; \
3775*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3776*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3777*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3778*da0073e9SAndroid Build Coastguard Worker "std 2,-16(12)\n\t" /* save tocptr */ \
3779*da0073e9SAndroid Build Coastguard Worker "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \
3780*da0073e9SAndroid Build Coastguard Worker "addi 1,1,-144\n\t" /* expand stack frame */ \
3781*da0073e9SAndroid Build Coastguard Worker /* arg12 */ \
3782*da0073e9SAndroid Build Coastguard Worker "ld 3,96(12)\n\t" \
3783*da0073e9SAndroid Build Coastguard Worker "std 3,120(1)\n\t" \
3784*da0073e9SAndroid Build Coastguard Worker /* arg11 */ \
3785*da0073e9SAndroid Build Coastguard Worker "ld 3,88(12)\n\t" \
3786*da0073e9SAndroid Build Coastguard Worker "std 3,112(1)\n\t" \
3787*da0073e9SAndroid Build Coastguard Worker /* arg10 */ \
3788*da0073e9SAndroid Build Coastguard Worker "ld 3,80(12)\n\t" \
3789*da0073e9SAndroid Build Coastguard Worker "std 3,104(1)\n\t" \
3790*da0073e9SAndroid Build Coastguard Worker /* arg9 */ \
3791*da0073e9SAndroid Build Coastguard Worker "ld 3,72(12)\n\t" \
3792*da0073e9SAndroid Build Coastguard Worker "std 3,96(1)\n\t" \
3793*da0073e9SAndroid Build Coastguard Worker /* args1-8 */ \
3794*da0073e9SAndroid Build Coastguard Worker "ld 3, 8(12)\n\t" /* arg1->r3 */ \
3795*da0073e9SAndroid Build Coastguard Worker "ld 4, 16(12)\n\t" /* arg2->r4 */ \
3796*da0073e9SAndroid Build Coastguard Worker "ld 5, 24(12)\n\t" /* arg3->r5 */ \
3797*da0073e9SAndroid Build Coastguard Worker "ld 6, 32(12)\n\t" /* arg4->r6 */ \
3798*da0073e9SAndroid Build Coastguard Worker "ld 7, 40(12)\n\t" /* arg5->r7 */ \
3799*da0073e9SAndroid Build Coastguard Worker "ld 8, 48(12)\n\t" /* arg6->r8 */ \
3800*da0073e9SAndroid Build Coastguard Worker "ld 9, 56(12)\n\t" /* arg7->r9 */ \
3801*da0073e9SAndroid Build Coastguard Worker "ld 10, 64(12)\n\t" /* arg8->r10 */ \
3802*da0073e9SAndroid Build Coastguard Worker "ld 12, 0(12)\n\t" /* target->r12 */ \
3803*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3804*da0073e9SAndroid Build Coastguard Worker "mr 12,%1\n\t" \
3805*da0073e9SAndroid Build Coastguard Worker "mr %0,3\n\t" \
3806*da0073e9SAndroid Build Coastguard Worker "ld 2,-16(12)\n\t" /* restore tocptr */ \
3807*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3808*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3809*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[2]) \
3810*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3811*da0073e9SAndroid Build Coastguard Worker ); \
3812*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3813*da0073e9SAndroid Build Coastguard Worker } while (0)
3814*da0073e9SAndroid Build Coastguard Worker
3815*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_ppc64le_linux */
3816*da0073e9SAndroid Build Coastguard Worker
3817*da0073e9SAndroid Build Coastguard Worker /* ------------------------- arm-linux ------------------------- */
3818*da0073e9SAndroid Build Coastguard Worker
3819*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_arm_linux)
3820*da0073e9SAndroid Build Coastguard Worker
3821*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
3822*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4", "r12", "r14"
3823*da0073e9SAndroid Build Coastguard Worker
3824*da0073e9SAndroid Build Coastguard Worker /* Macros to save and align the stack before making a function
3825*da0073e9SAndroid Build Coastguard Worker call and restore it afterwards as gcc may not keep the stack
3826*da0073e9SAndroid Build Coastguard Worker pointer aligned if it doesn't realise calls are being made
3827*da0073e9SAndroid Build Coastguard Worker to other functions. */
3828*da0073e9SAndroid Build Coastguard Worker
3829*da0073e9SAndroid Build Coastguard Worker /* This is a bit tricky. We store the original stack pointer in r10
3830*da0073e9SAndroid Build Coastguard Worker as it is callee-saves. gcc doesn't allow the use of r11 for some
3831*da0073e9SAndroid Build Coastguard Worker reason. Also, we can't directly "bic" the stack pointer in thumb
3832*da0073e9SAndroid Build Coastguard Worker mode since r13 isn't an allowed register number in that context.
3833*da0073e9SAndroid Build Coastguard Worker So use r4 as a temporary, since that is about to get trashed
3834*da0073e9SAndroid Build Coastguard Worker anyway, just after each use of this macro. Side effect is we need
3835*da0073e9SAndroid Build Coastguard Worker to be very careful about any future changes, since
3836*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK simply assumes r4 is usable. */
3837*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK \
3838*da0073e9SAndroid Build Coastguard Worker "mov r10, sp\n\t" \
3839*da0073e9SAndroid Build Coastguard Worker "mov r4, sp\n\t" \
3840*da0073e9SAndroid Build Coastguard Worker "bic r4, r4, #7\n\t" \
3841*da0073e9SAndroid Build Coastguard Worker "mov sp, r4\n\t"
3842*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK \
3843*da0073e9SAndroid Build Coastguard Worker "mov sp, r10\n\t"
3844*da0073e9SAndroid Build Coastguard Worker
3845*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned
3846*da0073e9SAndroid Build Coastguard Worker long) == 4. */
3847*da0073e9SAndroid Build Coastguard Worker
3848*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
3849*da0073e9SAndroid Build Coastguard Worker do { \
3850*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3851*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[1]; \
3852*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3853*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
3854*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3855*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3856*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
3857*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3858*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3859*da0073e9SAndroid Build Coastguard Worker "mov %0, r0\n" \
3860*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3861*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
3862*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3863*da0073e9SAndroid Build Coastguard Worker ); \
3864*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3865*da0073e9SAndroid Build Coastguard Worker } while (0)
3866*da0073e9SAndroid Build Coastguard Worker
3867*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
3868*da0073e9SAndroid Build Coastguard Worker do { \
3869*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3870*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[2]; \
3871*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3872*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
3873*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
3874*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3875*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3876*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
3877*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
3878*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3879*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3880*da0073e9SAndroid Build Coastguard Worker "mov %0, r0\n" \
3881*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3882*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
3883*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3884*da0073e9SAndroid Build Coastguard Worker ); \
3885*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3886*da0073e9SAndroid Build Coastguard Worker } while (0)
3887*da0073e9SAndroid Build Coastguard Worker
3888*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
3889*da0073e9SAndroid Build Coastguard Worker do { \
3890*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3891*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3]; \
3892*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3893*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
3894*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
3895*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
3896*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3897*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3898*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
3899*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
3900*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
3901*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3902*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3903*da0073e9SAndroid Build Coastguard Worker "mov %0, r0\n" \
3904*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3905*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
3906*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3907*da0073e9SAndroid Build Coastguard Worker ); \
3908*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3909*da0073e9SAndroid Build Coastguard Worker } while (0)
3910*da0073e9SAndroid Build Coastguard Worker
3911*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
3912*da0073e9SAndroid Build Coastguard Worker do { \
3913*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3914*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[4]; \
3915*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3916*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
3917*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
3918*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
3919*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
3920*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3921*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3922*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
3923*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
3924*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
3925*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
3926*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3927*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3928*da0073e9SAndroid Build Coastguard Worker "mov %0, r0\n" \
3929*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3930*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
3931*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3932*da0073e9SAndroid Build Coastguard Worker ); \
3933*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3934*da0073e9SAndroid Build Coastguard Worker } while (0)
3935*da0073e9SAndroid Build Coastguard Worker
3936*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
3937*da0073e9SAndroid Build Coastguard Worker do { \
3938*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3939*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[5]; \
3940*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3941*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
3942*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
3943*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
3944*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
3945*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
3946*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3947*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3948*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
3949*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
3950*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
3951*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #16] \n\t" \
3952*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
3953*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3954*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3955*da0073e9SAndroid Build Coastguard Worker "mov %0, r0" \
3956*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3957*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
3958*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3959*da0073e9SAndroid Build Coastguard Worker ); \
3960*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3961*da0073e9SAndroid Build Coastguard Worker } while (0)
3962*da0073e9SAndroid Build Coastguard Worker
3963*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
3964*da0073e9SAndroid Build Coastguard Worker do { \
3965*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3966*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[6]; \
3967*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3968*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
3969*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
3970*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
3971*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
3972*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
3973*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
3974*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
3975*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
3976*da0073e9SAndroid Build Coastguard Worker "sub sp, sp, #4 \n\t" \
3977*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #20] \n\t" \
3978*da0073e9SAndroid Build Coastguard Worker "push {r0} \n\t" \
3979*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
3980*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
3981*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
3982*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #16] \n\t" \
3983*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
3984*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3985*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
3986*da0073e9SAndroid Build Coastguard Worker "mov %0, r0" \
3987*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
3988*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
3989*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3990*da0073e9SAndroid Build Coastguard Worker ); \
3991*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
3992*da0073e9SAndroid Build Coastguard Worker } while (0)
3993*da0073e9SAndroid Build Coastguard Worker
3994*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
3995*da0073e9SAndroid Build Coastguard Worker do { \
3996*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
3997*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[7]; \
3998*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
3999*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4000*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4001*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4002*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4003*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4004*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4005*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4006*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4007*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4008*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #20] \n\t" \
4009*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #24] \n\t" \
4010*da0073e9SAndroid Build Coastguard Worker "push {r0, r1} \n\t" \
4011*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
4012*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
4013*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
4014*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #16] \n\t" \
4015*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
4016*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4017*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4018*da0073e9SAndroid Build Coastguard Worker "mov %0, r0" \
4019*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4020*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4021*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4022*da0073e9SAndroid Build Coastguard Worker ); \
4023*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4024*da0073e9SAndroid Build Coastguard Worker } while (0)
4025*da0073e9SAndroid Build Coastguard Worker
4026*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4027*da0073e9SAndroid Build Coastguard Worker arg7) \
4028*da0073e9SAndroid Build Coastguard Worker do { \
4029*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4030*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[8]; \
4031*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4032*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4033*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4034*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4035*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4036*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4037*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4038*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4039*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4040*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4041*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4042*da0073e9SAndroid Build Coastguard Worker "sub sp, sp, #4 \n\t" \
4043*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #20] \n\t" \
4044*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #24] \n\t" \
4045*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #28] \n\t" \
4046*da0073e9SAndroid Build Coastguard Worker "push {r0, r1, r2} \n\t" \
4047*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
4048*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
4049*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
4050*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #16] \n\t" \
4051*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
4052*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4053*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4054*da0073e9SAndroid Build Coastguard Worker "mov %0, r0" \
4055*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4056*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4057*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4058*da0073e9SAndroid Build Coastguard Worker ); \
4059*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4060*da0073e9SAndroid Build Coastguard Worker } while (0)
4061*da0073e9SAndroid Build Coastguard Worker
4062*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4063*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
4064*da0073e9SAndroid Build Coastguard Worker do { \
4065*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4066*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[9]; \
4067*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4068*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4069*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4070*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4071*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4072*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4073*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4074*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4075*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4076*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4077*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4078*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4079*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #20] \n\t" \
4080*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #24] \n\t" \
4081*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #28] \n\t" \
4082*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #32] \n\t" \
4083*da0073e9SAndroid Build Coastguard Worker "push {r0, r1, r2, r3} \n\t" \
4084*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
4085*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
4086*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
4087*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #16] \n\t" \
4088*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
4089*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4090*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4091*da0073e9SAndroid Build Coastguard Worker "mov %0, r0" \
4092*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4093*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4094*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4095*da0073e9SAndroid Build Coastguard Worker ); \
4096*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4097*da0073e9SAndroid Build Coastguard Worker } while (0)
4098*da0073e9SAndroid Build Coastguard Worker
4099*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4100*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
4101*da0073e9SAndroid Build Coastguard Worker do { \
4102*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4103*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[10]; \
4104*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4105*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4106*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4107*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4108*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4109*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4110*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4111*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4112*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4113*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4114*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
4115*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4116*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4117*da0073e9SAndroid Build Coastguard Worker "sub sp, sp, #4 \n\t" \
4118*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #20] \n\t" \
4119*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #24] \n\t" \
4120*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #28] \n\t" \
4121*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #32] \n\t" \
4122*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1, #36] \n\t" \
4123*da0073e9SAndroid Build Coastguard Worker "push {r0, r1, r2, r3, r4} \n\t" \
4124*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
4125*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
4126*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
4127*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #16] \n\t" \
4128*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
4129*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4130*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4131*da0073e9SAndroid Build Coastguard Worker "mov %0, r0" \
4132*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4133*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4134*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4135*da0073e9SAndroid Build Coastguard Worker ); \
4136*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4137*da0073e9SAndroid Build Coastguard Worker } while (0)
4138*da0073e9SAndroid Build Coastguard Worker
4139*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4140*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
4141*da0073e9SAndroid Build Coastguard Worker do { \
4142*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4143*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[11]; \
4144*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4145*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4146*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4147*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4148*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4149*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4150*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4151*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4152*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4153*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4154*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
4155*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
4156*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4157*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4158*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #40] \n\t" \
4159*da0073e9SAndroid Build Coastguard Worker "push {r0} \n\t" \
4160*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #20] \n\t" \
4161*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #24] \n\t" \
4162*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #28] \n\t" \
4163*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #32] \n\t" \
4164*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1, #36] \n\t" \
4165*da0073e9SAndroid Build Coastguard Worker "push {r0, r1, r2, r3, r4} \n\t" \
4166*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
4167*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
4168*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
4169*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #16] \n\t" \
4170*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
4171*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4172*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4173*da0073e9SAndroid Build Coastguard Worker "mov %0, r0" \
4174*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4175*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4176*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4177*da0073e9SAndroid Build Coastguard Worker ); \
4178*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4179*da0073e9SAndroid Build Coastguard Worker } while (0)
4180*da0073e9SAndroid Build Coastguard Worker
4181*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
4182*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
4183*da0073e9SAndroid Build Coastguard Worker arg11) \
4184*da0073e9SAndroid Build Coastguard Worker do { \
4185*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4186*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[12]; \
4187*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4188*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4189*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4190*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4191*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4192*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4193*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4194*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4195*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4196*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4197*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
4198*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
4199*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
4200*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4201*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4202*da0073e9SAndroid Build Coastguard Worker "sub sp, sp, #4 \n\t" \
4203*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #40] \n\t" \
4204*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #44] \n\t" \
4205*da0073e9SAndroid Build Coastguard Worker "push {r0, r1} \n\t" \
4206*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #20] \n\t" \
4207*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #24] \n\t" \
4208*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #28] \n\t" \
4209*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #32] \n\t" \
4210*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1, #36] \n\t" \
4211*da0073e9SAndroid Build Coastguard Worker "push {r0, r1, r2, r3, r4} \n\t" \
4212*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
4213*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
4214*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
4215*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #16] \n\t" \
4216*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
4217*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4218*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4219*da0073e9SAndroid Build Coastguard Worker "mov %0, r0" \
4220*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4221*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4222*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4223*da0073e9SAndroid Build Coastguard Worker ); \
4224*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4225*da0073e9SAndroid Build Coastguard Worker } while (0)
4226*da0073e9SAndroid Build Coastguard Worker
4227*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
4228*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
4229*da0073e9SAndroid Build Coastguard Worker arg11,arg12) \
4230*da0073e9SAndroid Build Coastguard Worker do { \
4231*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4232*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[13]; \
4233*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4234*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4235*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4236*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4237*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4238*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4239*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4240*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4241*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4242*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4243*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
4244*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
4245*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
4246*da0073e9SAndroid Build Coastguard Worker _argvec[12] = (unsigned long)(arg12); \
4247*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4248*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4249*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #40] \n\t" \
4250*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #44] \n\t" \
4251*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #48] \n\t" \
4252*da0073e9SAndroid Build Coastguard Worker "push {r0, r1, r2} \n\t" \
4253*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #20] \n\t" \
4254*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #24] \n\t" \
4255*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #28] \n\t" \
4256*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #32] \n\t" \
4257*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1, #36] \n\t" \
4258*da0073e9SAndroid Build Coastguard Worker "push {r0, r1, r2, r3, r4} \n\t" \
4259*da0073e9SAndroid Build Coastguard Worker "ldr r0, [%1, #4] \n\t" \
4260*da0073e9SAndroid Build Coastguard Worker "ldr r1, [%1, #8] \n\t" \
4261*da0073e9SAndroid Build Coastguard Worker "ldr r2, [%1, #12] \n\t" \
4262*da0073e9SAndroid Build Coastguard Worker "ldr r3, [%1, #16] \n\t" \
4263*da0073e9SAndroid Build Coastguard Worker "ldr r4, [%1] \n\t" /* target->r4 */ \
4264*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4265*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4266*da0073e9SAndroid Build Coastguard Worker "mov %0, r0" \
4267*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4268*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4269*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4270*da0073e9SAndroid Build Coastguard Worker ); \
4271*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4272*da0073e9SAndroid Build Coastguard Worker } while (0)
4273*da0073e9SAndroid Build Coastguard Worker
4274*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_arm_linux */
4275*da0073e9SAndroid Build Coastguard Worker
4276*da0073e9SAndroid Build Coastguard Worker /* ------------------------ arm64-linux ------------------------ */
4277*da0073e9SAndroid Build Coastguard Worker
4278*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_arm64_linux)
4279*da0073e9SAndroid Build Coastguard Worker
4280*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
4281*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS \
4282*da0073e9SAndroid Build Coastguard Worker "x0", "x1", "x2", "x3","x4", "x5", "x6", "x7", "x8", "x9", \
4283*da0073e9SAndroid Build Coastguard Worker "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", \
4284*da0073e9SAndroid Build Coastguard Worker "x18", "x19", "x20", "x30", \
4285*da0073e9SAndroid Build Coastguard Worker "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", \
4286*da0073e9SAndroid Build Coastguard Worker "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", \
4287*da0073e9SAndroid Build Coastguard Worker "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", \
4288*da0073e9SAndroid Build Coastguard Worker "v26", "v27", "v28", "v29", "v30", "v31"
4289*da0073e9SAndroid Build Coastguard Worker
4290*da0073e9SAndroid Build Coastguard Worker /* x21 is callee-saved, so we can use it to save and restore SP around
4291*da0073e9SAndroid Build Coastguard Worker the hidden call. */
4292*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ALIGN_STACK \
4293*da0073e9SAndroid Build Coastguard Worker "mov x21, sp\n\t" \
4294*da0073e9SAndroid Build Coastguard Worker "bic sp, x21, #15\n\t"
4295*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESTORE_STACK \
4296*da0073e9SAndroid Build Coastguard Worker "mov sp, x21\n\t"
4297*da0073e9SAndroid Build Coastguard Worker
4298*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on arm64-linux,
4299*da0073e9SAndroid Build Coastguard Worker sizeof(unsigned long) == 8. */
4300*da0073e9SAndroid Build Coastguard Worker
4301*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
4302*da0073e9SAndroid Build Coastguard Worker do { \
4303*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4304*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[1]; \
4305*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4306*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4307*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4308*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4309*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4310*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4311*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4312*da0073e9SAndroid Build Coastguard Worker "mov %0, x0\n" \
4313*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4314*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4315*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4316*da0073e9SAndroid Build Coastguard Worker ); \
4317*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4318*da0073e9SAndroid Build Coastguard Worker } while (0)
4319*da0073e9SAndroid Build Coastguard Worker
4320*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
4321*da0073e9SAndroid Build Coastguard Worker do { \
4322*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4323*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[2]; \
4324*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4325*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4326*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4327*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4328*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4329*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4330*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4331*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4332*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4333*da0073e9SAndroid Build Coastguard Worker "mov %0, x0\n" \
4334*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4335*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4336*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4337*da0073e9SAndroid Build Coastguard Worker ); \
4338*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4339*da0073e9SAndroid Build Coastguard Worker } while (0)
4340*da0073e9SAndroid Build Coastguard Worker
4341*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
4342*da0073e9SAndroid Build Coastguard Worker do { \
4343*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4344*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3]; \
4345*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4346*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4347*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4348*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4349*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4350*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4351*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4352*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4353*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4354*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4355*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4356*da0073e9SAndroid Build Coastguard Worker "mov %0, x0\n" \
4357*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4358*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4359*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4360*da0073e9SAndroid Build Coastguard Worker ); \
4361*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4362*da0073e9SAndroid Build Coastguard Worker } while (0)
4363*da0073e9SAndroid Build Coastguard Worker
4364*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
4365*da0073e9SAndroid Build Coastguard Worker do { \
4366*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4367*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[4]; \
4368*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4369*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4370*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4371*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4372*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4373*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4374*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4375*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4376*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4377*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4378*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4379*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4380*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4381*da0073e9SAndroid Build Coastguard Worker "mov %0, x0\n" \
4382*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4383*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4384*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4385*da0073e9SAndroid Build Coastguard Worker ); \
4386*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4387*da0073e9SAndroid Build Coastguard Worker } while (0)
4388*da0073e9SAndroid Build Coastguard Worker
4389*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
4390*da0073e9SAndroid Build Coastguard Worker do { \
4391*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4392*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[5]; \
4393*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4394*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4395*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4396*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4397*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4398*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4399*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4400*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4401*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4402*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4403*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4404*da0073e9SAndroid Build Coastguard Worker "ldr x3, [%1, #32] \n\t" \
4405*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4406*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4407*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4408*da0073e9SAndroid Build Coastguard Worker "mov %0, x0" \
4409*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4410*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4411*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4412*da0073e9SAndroid Build Coastguard Worker ); \
4413*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4414*da0073e9SAndroid Build Coastguard Worker } while (0)
4415*da0073e9SAndroid Build Coastguard Worker
4416*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
4417*da0073e9SAndroid Build Coastguard Worker do { \
4418*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4419*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[6]; \
4420*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4421*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4422*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4423*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4424*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4425*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4426*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4427*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4428*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4429*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4430*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4431*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4432*da0073e9SAndroid Build Coastguard Worker "ldr x3, [%1, #32] \n\t" \
4433*da0073e9SAndroid Build Coastguard Worker "ldr x4, [%1, #40] \n\t" \
4434*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4435*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4436*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4437*da0073e9SAndroid Build Coastguard Worker "mov %0, x0" \
4438*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4439*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4440*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4441*da0073e9SAndroid Build Coastguard Worker ); \
4442*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4443*da0073e9SAndroid Build Coastguard Worker } while (0)
4444*da0073e9SAndroid Build Coastguard Worker
4445*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
4446*da0073e9SAndroid Build Coastguard Worker do { \
4447*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4448*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[7]; \
4449*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4450*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4451*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4452*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4453*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4454*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4455*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4456*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4457*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4458*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4459*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4460*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4461*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4462*da0073e9SAndroid Build Coastguard Worker "ldr x3, [%1, #32] \n\t" \
4463*da0073e9SAndroid Build Coastguard Worker "ldr x4, [%1, #40] \n\t" \
4464*da0073e9SAndroid Build Coastguard Worker "ldr x5, [%1, #48] \n\t" \
4465*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4466*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4467*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4468*da0073e9SAndroid Build Coastguard Worker "mov %0, x0" \
4469*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4470*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4471*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4472*da0073e9SAndroid Build Coastguard Worker ); \
4473*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4474*da0073e9SAndroid Build Coastguard Worker } while (0)
4475*da0073e9SAndroid Build Coastguard Worker
4476*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4477*da0073e9SAndroid Build Coastguard Worker arg7) \
4478*da0073e9SAndroid Build Coastguard Worker do { \
4479*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4480*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[8]; \
4481*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4482*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4483*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4484*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4485*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4486*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4487*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4488*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4489*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4490*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4491*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4492*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4493*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4494*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4495*da0073e9SAndroid Build Coastguard Worker "ldr x3, [%1, #32] \n\t" \
4496*da0073e9SAndroid Build Coastguard Worker "ldr x4, [%1, #40] \n\t" \
4497*da0073e9SAndroid Build Coastguard Worker "ldr x5, [%1, #48] \n\t" \
4498*da0073e9SAndroid Build Coastguard Worker "ldr x6, [%1, #56] \n\t" \
4499*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4500*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4501*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4502*da0073e9SAndroid Build Coastguard Worker "mov %0, x0" \
4503*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4504*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4505*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4506*da0073e9SAndroid Build Coastguard Worker ); \
4507*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4508*da0073e9SAndroid Build Coastguard Worker } while (0)
4509*da0073e9SAndroid Build Coastguard Worker
4510*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4511*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
4512*da0073e9SAndroid Build Coastguard Worker do { \
4513*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4514*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[9]; \
4515*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4516*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4517*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4518*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4519*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4520*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4521*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4522*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4523*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4524*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4525*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4526*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4527*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4528*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4529*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4530*da0073e9SAndroid Build Coastguard Worker "ldr x3, [%1, #32] \n\t" \
4531*da0073e9SAndroid Build Coastguard Worker "ldr x4, [%1, #40] \n\t" \
4532*da0073e9SAndroid Build Coastguard Worker "ldr x5, [%1, #48] \n\t" \
4533*da0073e9SAndroid Build Coastguard Worker "ldr x6, [%1, #56] \n\t" \
4534*da0073e9SAndroid Build Coastguard Worker "ldr x7, [%1, #64] \n\t" \
4535*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4536*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4537*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4538*da0073e9SAndroid Build Coastguard Worker "mov %0, x0" \
4539*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4540*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4541*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4542*da0073e9SAndroid Build Coastguard Worker ); \
4543*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4544*da0073e9SAndroid Build Coastguard Worker } while (0)
4545*da0073e9SAndroid Build Coastguard Worker
4546*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4547*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
4548*da0073e9SAndroid Build Coastguard Worker do { \
4549*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4550*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[10]; \
4551*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4552*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4553*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4554*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4555*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4556*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4557*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4558*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4559*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4560*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4561*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
4562*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4563*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4564*da0073e9SAndroid Build Coastguard Worker "sub sp, sp, #0x20 \n\t" \
4565*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4566*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4567*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4568*da0073e9SAndroid Build Coastguard Worker "ldr x3, [%1, #32] \n\t" \
4569*da0073e9SAndroid Build Coastguard Worker "ldr x4, [%1, #40] \n\t" \
4570*da0073e9SAndroid Build Coastguard Worker "ldr x5, [%1, #48] \n\t" \
4571*da0073e9SAndroid Build Coastguard Worker "ldr x6, [%1, #56] \n\t" \
4572*da0073e9SAndroid Build Coastguard Worker "ldr x7, [%1, #64] \n\t" \
4573*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #72] \n\t" \
4574*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #0] \n\t" \
4575*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4576*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4577*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4578*da0073e9SAndroid Build Coastguard Worker "mov %0, x0" \
4579*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4580*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4581*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4582*da0073e9SAndroid Build Coastguard Worker ); \
4583*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4584*da0073e9SAndroid Build Coastguard Worker } while (0)
4585*da0073e9SAndroid Build Coastguard Worker
4586*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4587*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
4588*da0073e9SAndroid Build Coastguard Worker do { \
4589*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4590*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[11]; \
4591*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4592*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4593*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4594*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4595*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4596*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4597*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4598*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4599*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4600*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4601*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
4602*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
4603*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4604*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4605*da0073e9SAndroid Build Coastguard Worker "sub sp, sp, #0x20 \n\t" \
4606*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4607*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4608*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4609*da0073e9SAndroid Build Coastguard Worker "ldr x3, [%1, #32] \n\t" \
4610*da0073e9SAndroid Build Coastguard Worker "ldr x4, [%1, #40] \n\t" \
4611*da0073e9SAndroid Build Coastguard Worker "ldr x5, [%1, #48] \n\t" \
4612*da0073e9SAndroid Build Coastguard Worker "ldr x6, [%1, #56] \n\t" \
4613*da0073e9SAndroid Build Coastguard Worker "ldr x7, [%1, #64] \n\t" \
4614*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #72] \n\t" \
4615*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #0] \n\t" \
4616*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #80] \n\t" \
4617*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #8] \n\t" \
4618*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4619*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4620*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4621*da0073e9SAndroid Build Coastguard Worker "mov %0, x0" \
4622*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4623*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4624*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4625*da0073e9SAndroid Build Coastguard Worker ); \
4626*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4627*da0073e9SAndroid Build Coastguard Worker } while (0)
4628*da0073e9SAndroid Build Coastguard Worker
4629*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4630*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11) \
4631*da0073e9SAndroid Build Coastguard Worker do { \
4632*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4633*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[12]; \
4634*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4635*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4636*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4637*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4638*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4639*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4640*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4641*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4642*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4643*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4644*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
4645*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
4646*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
4647*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4648*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4649*da0073e9SAndroid Build Coastguard Worker "sub sp, sp, #0x30 \n\t" \
4650*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4651*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4652*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4653*da0073e9SAndroid Build Coastguard Worker "ldr x3, [%1, #32] \n\t" \
4654*da0073e9SAndroid Build Coastguard Worker "ldr x4, [%1, #40] \n\t" \
4655*da0073e9SAndroid Build Coastguard Worker "ldr x5, [%1, #48] \n\t" \
4656*da0073e9SAndroid Build Coastguard Worker "ldr x6, [%1, #56] \n\t" \
4657*da0073e9SAndroid Build Coastguard Worker "ldr x7, [%1, #64] \n\t" \
4658*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #72] \n\t" \
4659*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #0] \n\t" \
4660*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #80] \n\t" \
4661*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #8] \n\t" \
4662*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #88] \n\t" \
4663*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #16] \n\t" \
4664*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4665*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4666*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4667*da0073e9SAndroid Build Coastguard Worker "mov %0, x0" \
4668*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4669*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4670*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4671*da0073e9SAndroid Build Coastguard Worker ); \
4672*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4673*da0073e9SAndroid Build Coastguard Worker } while (0)
4674*da0073e9SAndroid Build Coastguard Worker
4675*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4676*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10,arg11, \
4677*da0073e9SAndroid Build Coastguard Worker arg12) \
4678*da0073e9SAndroid Build Coastguard Worker do { \
4679*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4680*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[13]; \
4681*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4682*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4683*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
4684*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
4685*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
4686*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
4687*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
4688*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
4689*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
4690*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
4691*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
4692*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
4693*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
4694*da0073e9SAndroid Build Coastguard Worker _argvec[12] = (unsigned long)(arg12); \
4695*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4696*da0073e9SAndroid Build Coastguard Worker VALGRIND_ALIGN_STACK \
4697*da0073e9SAndroid Build Coastguard Worker "sub sp, sp, #0x30 \n\t" \
4698*da0073e9SAndroid Build Coastguard Worker "ldr x0, [%1, #8] \n\t" \
4699*da0073e9SAndroid Build Coastguard Worker "ldr x1, [%1, #16] \n\t" \
4700*da0073e9SAndroid Build Coastguard Worker "ldr x2, [%1, #24] \n\t" \
4701*da0073e9SAndroid Build Coastguard Worker "ldr x3, [%1, #32] \n\t" \
4702*da0073e9SAndroid Build Coastguard Worker "ldr x4, [%1, #40] \n\t" \
4703*da0073e9SAndroid Build Coastguard Worker "ldr x5, [%1, #48] \n\t" \
4704*da0073e9SAndroid Build Coastguard Worker "ldr x6, [%1, #56] \n\t" \
4705*da0073e9SAndroid Build Coastguard Worker "ldr x7, [%1, #64] \n\t" \
4706*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #72] \n\t" \
4707*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #0] \n\t" \
4708*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #80] \n\t" \
4709*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #8] \n\t" \
4710*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #88] \n\t" \
4711*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #16] \n\t" \
4712*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1, #96] \n\t" \
4713*da0073e9SAndroid Build Coastguard Worker "str x8, [sp, #24] \n\t" \
4714*da0073e9SAndroid Build Coastguard Worker "ldr x8, [%1] \n\t" /* target->x8 */ \
4715*da0073e9SAndroid Build Coastguard Worker VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4716*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK \
4717*da0073e9SAndroid Build Coastguard Worker "mov %0, x0" \
4718*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
4719*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
4720*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4721*da0073e9SAndroid Build Coastguard Worker ); \
4722*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4723*da0073e9SAndroid Build Coastguard Worker } while (0)
4724*da0073e9SAndroid Build Coastguard Worker
4725*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_arm64_linux */
4726*da0073e9SAndroid Build Coastguard Worker
4727*da0073e9SAndroid Build Coastguard Worker /* ------------------------- s390x-linux ------------------------- */
4728*da0073e9SAndroid Build Coastguard Worker
4729*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_s390x_linux)
4730*da0073e9SAndroid Build Coastguard Worker
4731*da0073e9SAndroid Build Coastguard Worker /* Similar workaround as amd64 (see above), but we use r11 as frame
4732*da0073e9SAndroid Build Coastguard Worker pointer and save the old r11 in r7. r11 might be used for
4733*da0073e9SAndroid Build Coastguard Worker argvec, therefore we copy argvec in r1 since r1 is clobbered
4734*da0073e9SAndroid Build Coastguard Worker after the call anyway. */
4735*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
4736*da0073e9SAndroid Build Coastguard Worker # define __FRAME_POINTER \
4737*da0073e9SAndroid Build Coastguard Worker ,"d"(__builtin_dwarf_cfa())
4738*da0073e9SAndroid Build Coastguard Worker # define VALGRIND_CFI_PROLOGUE \
4739*da0073e9SAndroid Build Coastguard Worker ".cfi_remember_state\n\t" \
4740*da0073e9SAndroid Build Coastguard Worker "lgr 1,%1\n\t" /* copy the argvec pointer in r1 */ \
4741*da0073e9SAndroid Build Coastguard Worker "lgr 7,11\n\t" \
4742*da0073e9SAndroid Build Coastguard Worker "lgr 11,%2\n\t" \
4743*da0073e9SAndroid Build Coastguard Worker ".cfi_def_cfa r11, 0\n\t"
4744*da0073e9SAndroid Build Coastguard Worker # define VALGRIND_CFI_EPILOGUE \
4745*da0073e9SAndroid Build Coastguard Worker "lgr 11, 7\n\t" \
4746*da0073e9SAndroid Build Coastguard Worker ".cfi_restore_state\n\t"
4747*da0073e9SAndroid Build Coastguard Worker #else
4748*da0073e9SAndroid Build Coastguard Worker # define __FRAME_POINTER
4749*da0073e9SAndroid Build Coastguard Worker # define VALGRIND_CFI_PROLOGUE \
4750*da0073e9SAndroid Build Coastguard Worker "lgr 1,%1\n\t"
4751*da0073e9SAndroid Build Coastguard Worker # define VALGRIND_CFI_EPILOGUE
4752*da0073e9SAndroid Build Coastguard Worker #endif
4753*da0073e9SAndroid Build Coastguard Worker
4754*da0073e9SAndroid Build Coastguard Worker /* Nb: On s390 the stack pointer is properly aligned *at all times*
4755*da0073e9SAndroid Build Coastguard Worker according to the s390 GCC maintainer. (The ABI specification is not
4756*da0073e9SAndroid Build Coastguard Worker precise in this regard.) Therefore, VALGRIND_ALIGN_STACK and
4757*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESTORE_STACK are not defined here. */
4758*da0073e9SAndroid Build Coastguard Worker
4759*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. Note that we overwrite
4760*da0073e9SAndroid Build Coastguard Worker r14 in s390_irgen_noredir (VEX/priv/guest_s390_irgen.c) to give the
4761*da0073e9SAndroid Build Coastguard Worker function a proper return address. All others are ABI defined call
4762*da0073e9SAndroid Build Coastguard Worker clobbers. */
4763*da0073e9SAndroid Build Coastguard Worker #if defined(__VX__) || defined(__S390_VX__)
4764*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "0", "1", "2", "3", "4", "5", "14", \
4765*da0073e9SAndroid Build Coastguard Worker "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", \
4766*da0073e9SAndroid Build Coastguard Worker "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", \
4767*da0073e9SAndroid Build Coastguard Worker "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", \
4768*da0073e9SAndroid Build Coastguard Worker "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4769*da0073e9SAndroid Build Coastguard Worker #else
4770*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "0", "1", "2", "3", "4", "5", "14", \
4771*da0073e9SAndroid Build Coastguard Worker "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7"
4772*da0073e9SAndroid Build Coastguard Worker #endif
4773*da0073e9SAndroid Build Coastguard Worker
4774*da0073e9SAndroid Build Coastguard Worker /* Nb: Although r11 is modified in the asm snippets below (inside
4775*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE) it is not listed in the clobber section, for
4776*da0073e9SAndroid Build Coastguard Worker two reasons:
4777*da0073e9SAndroid Build Coastguard Worker (1) r11 is restored in VALGRIND_CFI_EPILOGUE, so effectively it is not
4778*da0073e9SAndroid Build Coastguard Worker modified
4779*da0073e9SAndroid Build Coastguard Worker (2) GCC will complain that r11 cannot appear inside a clobber section,
4780*da0073e9SAndroid Build Coastguard Worker when compiled with -O -fno-omit-frame-pointer
4781*da0073e9SAndroid Build Coastguard Worker */
4782*da0073e9SAndroid Build Coastguard Worker
4783*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
4784*da0073e9SAndroid Build Coastguard Worker do { \
4785*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4786*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[1]; \
4787*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4788*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4789*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4790*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
4791*da0073e9SAndroid Build Coastguard Worker "aghi 15,-160\n\t" \
4792*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" /* target->r1 */ \
4793*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
4794*da0073e9SAndroid Build Coastguard Worker "aghi 15,160\n\t" \
4795*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
4796*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
4797*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
4798*da0073e9SAndroid Build Coastguard Worker : /*in*/ "d" (&_argvec[0]) __FRAME_POINTER \
4799*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
4800*da0073e9SAndroid Build Coastguard Worker ); \
4801*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4802*da0073e9SAndroid Build Coastguard Worker } while (0)
4803*da0073e9SAndroid Build Coastguard Worker
4804*da0073e9SAndroid Build Coastguard Worker /* The call abi has the arguments in r2-r6 and stack */
4805*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
4806*da0073e9SAndroid Build Coastguard Worker do { \
4807*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4808*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[2]; \
4809*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4810*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4811*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
4812*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4813*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
4814*da0073e9SAndroid Build Coastguard Worker "aghi 15,-160\n\t" \
4815*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
4816*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
4817*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
4818*da0073e9SAndroid Build Coastguard Worker "aghi 15,160\n\t" \
4819*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
4820*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
4821*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
4822*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
4823*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
4824*da0073e9SAndroid Build Coastguard Worker ); \
4825*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4826*da0073e9SAndroid Build Coastguard Worker } while (0)
4827*da0073e9SAndroid Build Coastguard Worker
4828*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1, arg2) \
4829*da0073e9SAndroid Build Coastguard Worker do { \
4830*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4831*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3]; \
4832*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4833*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4834*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
4835*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
4836*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4837*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
4838*da0073e9SAndroid Build Coastguard Worker "aghi 15,-160\n\t" \
4839*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
4840*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
4841*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
4842*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
4843*da0073e9SAndroid Build Coastguard Worker "aghi 15,160\n\t" \
4844*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
4845*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
4846*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
4847*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
4848*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
4849*da0073e9SAndroid Build Coastguard Worker ); \
4850*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4851*da0073e9SAndroid Build Coastguard Worker } while (0)
4852*da0073e9SAndroid Build Coastguard Worker
4853*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3) \
4854*da0073e9SAndroid Build Coastguard Worker do { \
4855*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4856*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[4]; \
4857*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4858*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4859*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
4860*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
4861*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
4862*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4863*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
4864*da0073e9SAndroid Build Coastguard Worker "aghi 15,-160\n\t" \
4865*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
4866*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
4867*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
4868*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
4869*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
4870*da0073e9SAndroid Build Coastguard Worker "aghi 15,160\n\t" \
4871*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
4872*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
4873*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
4874*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
4875*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
4876*da0073e9SAndroid Build Coastguard Worker ); \
4877*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4878*da0073e9SAndroid Build Coastguard Worker } while (0)
4879*da0073e9SAndroid Build Coastguard Worker
4880*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4) \
4881*da0073e9SAndroid Build Coastguard Worker do { \
4882*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4883*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[5]; \
4884*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4885*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4886*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
4887*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
4888*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
4889*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
4890*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4891*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
4892*da0073e9SAndroid Build Coastguard Worker "aghi 15,-160\n\t" \
4893*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
4894*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
4895*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
4896*da0073e9SAndroid Build Coastguard Worker "lg 5,32(1)\n\t" \
4897*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
4898*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
4899*da0073e9SAndroid Build Coastguard Worker "aghi 15,160\n\t" \
4900*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
4901*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
4902*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
4903*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
4904*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
4905*da0073e9SAndroid Build Coastguard Worker ); \
4906*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4907*da0073e9SAndroid Build Coastguard Worker } while (0)
4908*da0073e9SAndroid Build Coastguard Worker
4909*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5) \
4910*da0073e9SAndroid Build Coastguard Worker do { \
4911*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4912*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[6]; \
4913*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4914*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4915*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
4916*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
4917*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
4918*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
4919*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
4920*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4921*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
4922*da0073e9SAndroid Build Coastguard Worker "aghi 15,-160\n\t" \
4923*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
4924*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
4925*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
4926*da0073e9SAndroid Build Coastguard Worker "lg 5,32(1)\n\t" \
4927*da0073e9SAndroid Build Coastguard Worker "lg 6,40(1)\n\t" \
4928*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
4929*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
4930*da0073e9SAndroid Build Coastguard Worker "aghi 15,160\n\t" \
4931*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
4932*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
4933*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
4934*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
4935*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
4936*da0073e9SAndroid Build Coastguard Worker ); \
4937*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4938*da0073e9SAndroid Build Coastguard Worker } while (0)
4939*da0073e9SAndroid Build Coastguard Worker
4940*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
4941*da0073e9SAndroid Build Coastguard Worker arg6) \
4942*da0073e9SAndroid Build Coastguard Worker do { \
4943*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4944*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[7]; \
4945*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4946*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4947*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
4948*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
4949*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
4950*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
4951*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
4952*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
4953*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4954*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
4955*da0073e9SAndroid Build Coastguard Worker "aghi 15,-168\n\t" \
4956*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
4957*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
4958*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
4959*da0073e9SAndroid Build Coastguard Worker "lg 5,32(1)\n\t" \
4960*da0073e9SAndroid Build Coastguard Worker "lg 6,40(1)\n\t" \
4961*da0073e9SAndroid Build Coastguard Worker "mvc 160(8,15), 48(1)\n\t" \
4962*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
4963*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
4964*da0073e9SAndroid Build Coastguard Worker "aghi 15,168\n\t" \
4965*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
4966*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
4967*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
4968*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
4969*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
4970*da0073e9SAndroid Build Coastguard Worker ); \
4971*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
4972*da0073e9SAndroid Build Coastguard Worker } while (0)
4973*da0073e9SAndroid Build Coastguard Worker
4974*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
4975*da0073e9SAndroid Build Coastguard Worker arg6, arg7) \
4976*da0073e9SAndroid Build Coastguard Worker do { \
4977*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
4978*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[8]; \
4979*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
4980*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
4981*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
4982*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
4983*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
4984*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
4985*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
4986*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
4987*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
4988*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
4989*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
4990*da0073e9SAndroid Build Coastguard Worker "aghi 15,-176\n\t" \
4991*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
4992*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
4993*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
4994*da0073e9SAndroid Build Coastguard Worker "lg 5,32(1)\n\t" \
4995*da0073e9SAndroid Build Coastguard Worker "lg 6,40(1)\n\t" \
4996*da0073e9SAndroid Build Coastguard Worker "mvc 160(8,15), 48(1)\n\t" \
4997*da0073e9SAndroid Build Coastguard Worker "mvc 168(8,15), 56(1)\n\t" \
4998*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
4999*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
5000*da0073e9SAndroid Build Coastguard Worker "aghi 15,176\n\t" \
5001*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
5002*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
5003*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
5004*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
5005*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5006*da0073e9SAndroid Build Coastguard Worker ); \
5007*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5008*da0073e9SAndroid Build Coastguard Worker } while (0)
5009*da0073e9SAndroid Build Coastguard Worker
5010*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
5011*da0073e9SAndroid Build Coastguard Worker arg6, arg7 ,arg8) \
5012*da0073e9SAndroid Build Coastguard Worker do { \
5013*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5014*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[9]; \
5015*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5016*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5017*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
5018*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
5019*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
5020*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
5021*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
5022*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
5023*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
5024*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
5025*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5026*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
5027*da0073e9SAndroid Build Coastguard Worker "aghi 15,-184\n\t" \
5028*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
5029*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
5030*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
5031*da0073e9SAndroid Build Coastguard Worker "lg 5,32(1)\n\t" \
5032*da0073e9SAndroid Build Coastguard Worker "lg 6,40(1)\n\t" \
5033*da0073e9SAndroid Build Coastguard Worker "mvc 160(8,15), 48(1)\n\t" \
5034*da0073e9SAndroid Build Coastguard Worker "mvc 168(8,15), 56(1)\n\t" \
5035*da0073e9SAndroid Build Coastguard Worker "mvc 176(8,15), 64(1)\n\t" \
5036*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
5037*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
5038*da0073e9SAndroid Build Coastguard Worker "aghi 15,184\n\t" \
5039*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
5040*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
5041*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
5042*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
5043*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5044*da0073e9SAndroid Build Coastguard Worker ); \
5045*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5046*da0073e9SAndroid Build Coastguard Worker } while (0)
5047*da0073e9SAndroid Build Coastguard Worker
5048*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
5049*da0073e9SAndroid Build Coastguard Worker arg6, arg7 ,arg8, arg9) \
5050*da0073e9SAndroid Build Coastguard Worker do { \
5051*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5052*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[10]; \
5053*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5054*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5055*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
5056*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
5057*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
5058*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
5059*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
5060*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
5061*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
5062*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
5063*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)arg9; \
5064*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5065*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
5066*da0073e9SAndroid Build Coastguard Worker "aghi 15,-192\n\t" \
5067*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
5068*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
5069*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
5070*da0073e9SAndroid Build Coastguard Worker "lg 5,32(1)\n\t" \
5071*da0073e9SAndroid Build Coastguard Worker "lg 6,40(1)\n\t" \
5072*da0073e9SAndroid Build Coastguard Worker "mvc 160(8,15), 48(1)\n\t" \
5073*da0073e9SAndroid Build Coastguard Worker "mvc 168(8,15), 56(1)\n\t" \
5074*da0073e9SAndroid Build Coastguard Worker "mvc 176(8,15), 64(1)\n\t" \
5075*da0073e9SAndroid Build Coastguard Worker "mvc 184(8,15), 72(1)\n\t" \
5076*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
5077*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
5078*da0073e9SAndroid Build Coastguard Worker "aghi 15,192\n\t" \
5079*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
5080*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
5081*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
5082*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
5083*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5084*da0073e9SAndroid Build Coastguard Worker ); \
5085*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5086*da0073e9SAndroid Build Coastguard Worker } while (0)
5087*da0073e9SAndroid Build Coastguard Worker
5088*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
5089*da0073e9SAndroid Build Coastguard Worker arg6, arg7 ,arg8, arg9, arg10) \
5090*da0073e9SAndroid Build Coastguard Worker do { \
5091*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5092*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[11]; \
5093*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5094*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5095*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
5096*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
5097*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
5098*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
5099*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
5100*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
5101*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
5102*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
5103*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)arg9; \
5104*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)arg10; \
5105*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5106*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
5107*da0073e9SAndroid Build Coastguard Worker "aghi 15,-200\n\t" \
5108*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
5109*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
5110*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
5111*da0073e9SAndroid Build Coastguard Worker "lg 5,32(1)\n\t" \
5112*da0073e9SAndroid Build Coastguard Worker "lg 6,40(1)\n\t" \
5113*da0073e9SAndroid Build Coastguard Worker "mvc 160(8,15), 48(1)\n\t" \
5114*da0073e9SAndroid Build Coastguard Worker "mvc 168(8,15), 56(1)\n\t" \
5115*da0073e9SAndroid Build Coastguard Worker "mvc 176(8,15), 64(1)\n\t" \
5116*da0073e9SAndroid Build Coastguard Worker "mvc 184(8,15), 72(1)\n\t" \
5117*da0073e9SAndroid Build Coastguard Worker "mvc 192(8,15), 80(1)\n\t" \
5118*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
5119*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
5120*da0073e9SAndroid Build Coastguard Worker "aghi 15,200\n\t" \
5121*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
5122*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
5123*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
5124*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
5125*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5126*da0073e9SAndroid Build Coastguard Worker ); \
5127*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5128*da0073e9SAndroid Build Coastguard Worker } while (0)
5129*da0073e9SAndroid Build Coastguard Worker
5130*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
5131*da0073e9SAndroid Build Coastguard Worker arg6, arg7 ,arg8, arg9, arg10, arg11) \
5132*da0073e9SAndroid Build Coastguard Worker do { \
5133*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5134*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[12]; \
5135*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5136*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5137*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
5138*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
5139*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
5140*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
5141*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
5142*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
5143*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
5144*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
5145*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)arg9; \
5146*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)arg10; \
5147*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)arg11; \
5148*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5149*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
5150*da0073e9SAndroid Build Coastguard Worker "aghi 15,-208\n\t" \
5151*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
5152*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
5153*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
5154*da0073e9SAndroid Build Coastguard Worker "lg 5,32(1)\n\t" \
5155*da0073e9SAndroid Build Coastguard Worker "lg 6,40(1)\n\t" \
5156*da0073e9SAndroid Build Coastguard Worker "mvc 160(8,15), 48(1)\n\t" \
5157*da0073e9SAndroid Build Coastguard Worker "mvc 168(8,15), 56(1)\n\t" \
5158*da0073e9SAndroid Build Coastguard Worker "mvc 176(8,15), 64(1)\n\t" \
5159*da0073e9SAndroid Build Coastguard Worker "mvc 184(8,15), 72(1)\n\t" \
5160*da0073e9SAndroid Build Coastguard Worker "mvc 192(8,15), 80(1)\n\t" \
5161*da0073e9SAndroid Build Coastguard Worker "mvc 200(8,15), 88(1)\n\t" \
5162*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
5163*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
5164*da0073e9SAndroid Build Coastguard Worker "aghi 15,208\n\t" \
5165*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
5166*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
5167*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
5168*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
5169*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5170*da0073e9SAndroid Build Coastguard Worker ); \
5171*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5172*da0073e9SAndroid Build Coastguard Worker } while (0)
5173*da0073e9SAndroid Build Coastguard Worker
5174*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
5175*da0073e9SAndroid Build Coastguard Worker arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\
5176*da0073e9SAndroid Build Coastguard Worker do { \
5177*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5178*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[13]; \
5179*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5180*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5181*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)arg1; \
5182*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)arg2; \
5183*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)arg3; \
5184*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)arg4; \
5185*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)arg5; \
5186*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)arg6; \
5187*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)arg7; \
5188*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)arg8; \
5189*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)arg9; \
5190*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)arg10; \
5191*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)arg11; \
5192*da0073e9SAndroid Build Coastguard Worker _argvec[12] = (unsigned long)arg12; \
5193*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5194*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_PROLOGUE \
5195*da0073e9SAndroid Build Coastguard Worker "aghi 15,-216\n\t" \
5196*da0073e9SAndroid Build Coastguard Worker "lg 2, 8(1)\n\t" \
5197*da0073e9SAndroid Build Coastguard Worker "lg 3,16(1)\n\t" \
5198*da0073e9SAndroid Build Coastguard Worker "lg 4,24(1)\n\t" \
5199*da0073e9SAndroid Build Coastguard Worker "lg 5,32(1)\n\t" \
5200*da0073e9SAndroid Build Coastguard Worker "lg 6,40(1)\n\t" \
5201*da0073e9SAndroid Build Coastguard Worker "mvc 160(8,15), 48(1)\n\t" \
5202*da0073e9SAndroid Build Coastguard Worker "mvc 168(8,15), 56(1)\n\t" \
5203*da0073e9SAndroid Build Coastguard Worker "mvc 176(8,15), 64(1)\n\t" \
5204*da0073e9SAndroid Build Coastguard Worker "mvc 184(8,15), 72(1)\n\t" \
5205*da0073e9SAndroid Build Coastguard Worker "mvc 192(8,15), 80(1)\n\t" \
5206*da0073e9SAndroid Build Coastguard Worker "mvc 200(8,15), 88(1)\n\t" \
5207*da0073e9SAndroid Build Coastguard Worker "mvc 208(8,15), 96(1)\n\t" \
5208*da0073e9SAndroid Build Coastguard Worker "lg 1, 0(1)\n\t" \
5209*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_R1 \
5210*da0073e9SAndroid Build Coastguard Worker "aghi 15,216\n\t" \
5211*da0073e9SAndroid Build Coastguard Worker VALGRIND_CFI_EPILOGUE \
5212*da0073e9SAndroid Build Coastguard Worker "lgr %0, 2\n\t" \
5213*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=d" (_res) \
5214*da0073e9SAndroid Build Coastguard Worker : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
5215*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5216*da0073e9SAndroid Build Coastguard Worker ); \
5217*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5218*da0073e9SAndroid Build Coastguard Worker } while (0)
5219*da0073e9SAndroid Build Coastguard Worker
5220*da0073e9SAndroid Build Coastguard Worker
5221*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_s390x_linux */
5222*da0073e9SAndroid Build Coastguard Worker
5223*da0073e9SAndroid Build Coastguard Worker /* ------------------------- mips32-linux ----------------------- */
5224*da0073e9SAndroid Build Coastguard Worker
5225*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_mips32_linux)
5226*da0073e9SAndroid Build Coastguard Worker
5227*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
5228*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \
5229*da0073e9SAndroid Build Coastguard Worker "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
5230*da0073e9SAndroid Build Coastguard Worker "$25", "$31"
5231*da0073e9SAndroid Build Coastguard Worker
5232*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned
5233*da0073e9SAndroid Build Coastguard Worker long) == 4. */
5234*da0073e9SAndroid Build Coastguard Worker
5235*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
5236*da0073e9SAndroid Build Coastguard Worker do { \
5237*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5238*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[1]; \
5239*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5240*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5241*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5242*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5243*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5244*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5245*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 16 \n\t" \
5246*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5247*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5248*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 16\n\t" \
5249*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5250*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5251*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5252*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5253*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5254*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5255*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5256*da0073e9SAndroid Build Coastguard Worker ); \
5257*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5258*da0073e9SAndroid Build Coastguard Worker } while (0)
5259*da0073e9SAndroid Build Coastguard Worker
5260*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
5261*da0073e9SAndroid Build Coastguard Worker do { \
5262*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5263*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[2]; \
5264*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5265*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5266*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5267*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5268*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5269*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5270*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5271*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 16 \n\t" \
5272*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" /* arg1*/ \
5273*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5274*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5275*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 16 \n\t" \
5276*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5277*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5278*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5279*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5280*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5281*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5282*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5283*da0073e9SAndroid Build Coastguard Worker ); \
5284*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5285*da0073e9SAndroid Build Coastguard Worker } while (0)
5286*da0073e9SAndroid Build Coastguard Worker
5287*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
5288*da0073e9SAndroid Build Coastguard Worker do { \
5289*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5290*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3]; \
5291*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5292*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5293*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5294*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5295*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5296*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5297*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5298*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5299*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 16 \n\t" \
5300*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5301*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5302*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5303*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5304*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 16 \n\t" \
5305*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5306*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5307*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5308*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5309*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5310*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5311*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5312*da0073e9SAndroid Build Coastguard Worker ); \
5313*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5314*da0073e9SAndroid Build Coastguard Worker } while (0)
5315*da0073e9SAndroid Build Coastguard Worker
5316*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
5317*da0073e9SAndroid Build Coastguard Worker do { \
5318*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5319*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[4]; \
5320*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5321*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5322*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5323*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5324*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5325*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5326*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5327*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5328*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5329*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 16 \n\t" \
5330*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5331*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5332*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5333*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5334*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5335*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 16 \n\t" \
5336*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5337*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5338*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5339*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5340*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5341*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5342*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5343*da0073e9SAndroid Build Coastguard Worker ); \
5344*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5345*da0073e9SAndroid Build Coastguard Worker } while (0)
5346*da0073e9SAndroid Build Coastguard Worker
5347*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
5348*da0073e9SAndroid Build Coastguard Worker do { \
5349*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5350*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[5]; \
5351*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5352*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5353*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5354*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5355*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5356*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5357*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5358*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5359*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5360*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5361*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 16 \n\t" \
5362*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5363*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5364*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5365*da0073e9SAndroid Build Coastguard Worker "lw $7, 16(%1) \n\t" \
5366*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5367*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5368*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 16 \n\t" \
5369*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5370*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5371*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5372*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5373*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5374*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5375*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5376*da0073e9SAndroid Build Coastguard Worker ); \
5377*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5378*da0073e9SAndroid Build Coastguard Worker } while (0)
5379*da0073e9SAndroid Build Coastguard Worker
5380*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
5381*da0073e9SAndroid Build Coastguard Worker do { \
5382*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5383*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[6]; \
5384*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5385*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5386*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5387*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5388*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5389*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5390*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5391*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5392*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5393*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5394*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5395*da0073e9SAndroid Build Coastguard Worker "lw $4, 20(%1) \n\t" \
5396*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 24\n\t" \
5397*da0073e9SAndroid Build Coastguard Worker "sw $4, 16($29) \n\t" \
5398*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5399*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5400*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5401*da0073e9SAndroid Build Coastguard Worker "lw $7, 16(%1) \n\t" \
5402*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5403*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5404*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 24 \n\t" \
5405*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5406*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5407*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5408*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5409*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5410*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5411*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5412*da0073e9SAndroid Build Coastguard Worker ); \
5413*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5414*da0073e9SAndroid Build Coastguard Worker } while (0)
5415*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
5416*da0073e9SAndroid Build Coastguard Worker do { \
5417*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5418*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[7]; \
5419*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5420*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5421*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5422*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5423*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5424*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5425*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5426*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5427*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5428*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5429*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5430*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5431*da0073e9SAndroid Build Coastguard Worker "lw $4, 20(%1) \n\t" \
5432*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 32\n\t" \
5433*da0073e9SAndroid Build Coastguard Worker "sw $4, 16($29) \n\t" \
5434*da0073e9SAndroid Build Coastguard Worker "lw $4, 24(%1) \n\t" \
5435*da0073e9SAndroid Build Coastguard Worker "nop\n\t" \
5436*da0073e9SAndroid Build Coastguard Worker "sw $4, 20($29) \n\t" \
5437*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5438*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5439*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5440*da0073e9SAndroid Build Coastguard Worker "lw $7, 16(%1) \n\t" \
5441*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5442*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5443*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 32 \n\t" \
5444*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5445*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5446*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5447*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5448*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5449*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5450*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5451*da0073e9SAndroid Build Coastguard Worker ); \
5452*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5453*da0073e9SAndroid Build Coastguard Worker } while (0)
5454*da0073e9SAndroid Build Coastguard Worker
5455*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5456*da0073e9SAndroid Build Coastguard Worker arg7) \
5457*da0073e9SAndroid Build Coastguard Worker do { \
5458*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5459*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[8]; \
5460*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5461*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5462*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5463*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5464*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5465*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5466*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5467*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5468*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
5469*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5470*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5471*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5472*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5473*da0073e9SAndroid Build Coastguard Worker "lw $4, 20(%1) \n\t" \
5474*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 32\n\t" \
5475*da0073e9SAndroid Build Coastguard Worker "sw $4, 16($29) \n\t" \
5476*da0073e9SAndroid Build Coastguard Worker "lw $4, 24(%1) \n\t" \
5477*da0073e9SAndroid Build Coastguard Worker "sw $4, 20($29) \n\t" \
5478*da0073e9SAndroid Build Coastguard Worker "lw $4, 28(%1) \n\t" \
5479*da0073e9SAndroid Build Coastguard Worker "sw $4, 24($29) \n\t" \
5480*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5481*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5482*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5483*da0073e9SAndroid Build Coastguard Worker "lw $7, 16(%1) \n\t" \
5484*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5485*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5486*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 32 \n\t" \
5487*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5488*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5489*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5490*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5491*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5492*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5493*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5494*da0073e9SAndroid Build Coastguard Worker ); \
5495*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5496*da0073e9SAndroid Build Coastguard Worker } while (0)
5497*da0073e9SAndroid Build Coastguard Worker
5498*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5499*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
5500*da0073e9SAndroid Build Coastguard Worker do { \
5501*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5502*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[9]; \
5503*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5504*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5505*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5506*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5507*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5508*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5509*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5510*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5511*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
5512*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
5513*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5514*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5515*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5516*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5517*da0073e9SAndroid Build Coastguard Worker "lw $4, 20(%1) \n\t" \
5518*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 40\n\t" \
5519*da0073e9SAndroid Build Coastguard Worker "sw $4, 16($29) \n\t" \
5520*da0073e9SAndroid Build Coastguard Worker "lw $4, 24(%1) \n\t" \
5521*da0073e9SAndroid Build Coastguard Worker "sw $4, 20($29) \n\t" \
5522*da0073e9SAndroid Build Coastguard Worker "lw $4, 28(%1) \n\t" \
5523*da0073e9SAndroid Build Coastguard Worker "sw $4, 24($29) \n\t" \
5524*da0073e9SAndroid Build Coastguard Worker "lw $4, 32(%1) \n\t" \
5525*da0073e9SAndroid Build Coastguard Worker "sw $4, 28($29) \n\t" \
5526*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5527*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5528*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5529*da0073e9SAndroid Build Coastguard Worker "lw $7, 16(%1) \n\t" \
5530*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5531*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5532*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 40 \n\t" \
5533*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5534*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5535*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5536*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5537*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5538*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5539*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5540*da0073e9SAndroid Build Coastguard Worker ); \
5541*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5542*da0073e9SAndroid Build Coastguard Worker } while (0)
5543*da0073e9SAndroid Build Coastguard Worker
5544*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5545*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
5546*da0073e9SAndroid Build Coastguard Worker do { \
5547*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5548*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[10]; \
5549*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5550*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5551*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5552*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5553*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5554*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5555*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5556*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5557*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
5558*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
5559*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
5560*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5561*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5562*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5563*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5564*da0073e9SAndroid Build Coastguard Worker "lw $4, 20(%1) \n\t" \
5565*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 40\n\t" \
5566*da0073e9SAndroid Build Coastguard Worker "sw $4, 16($29) \n\t" \
5567*da0073e9SAndroid Build Coastguard Worker "lw $4, 24(%1) \n\t" \
5568*da0073e9SAndroid Build Coastguard Worker "sw $4, 20($29) \n\t" \
5569*da0073e9SAndroid Build Coastguard Worker "lw $4, 28(%1) \n\t" \
5570*da0073e9SAndroid Build Coastguard Worker "sw $4, 24($29) \n\t" \
5571*da0073e9SAndroid Build Coastguard Worker "lw $4, 32(%1) \n\t" \
5572*da0073e9SAndroid Build Coastguard Worker "sw $4, 28($29) \n\t" \
5573*da0073e9SAndroid Build Coastguard Worker "lw $4, 36(%1) \n\t" \
5574*da0073e9SAndroid Build Coastguard Worker "sw $4, 32($29) \n\t" \
5575*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5576*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5577*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5578*da0073e9SAndroid Build Coastguard Worker "lw $7, 16(%1) \n\t" \
5579*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5580*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5581*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 40 \n\t" \
5582*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5583*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5584*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5585*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5586*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5587*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5588*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5589*da0073e9SAndroid Build Coastguard Worker ); \
5590*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5591*da0073e9SAndroid Build Coastguard Worker } while (0)
5592*da0073e9SAndroid Build Coastguard Worker
5593*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5594*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
5595*da0073e9SAndroid Build Coastguard Worker do { \
5596*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5597*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[11]; \
5598*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5599*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5600*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5601*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5602*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5603*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5604*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5605*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5606*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
5607*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
5608*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
5609*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
5610*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5611*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5612*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5613*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5614*da0073e9SAndroid Build Coastguard Worker "lw $4, 20(%1) \n\t" \
5615*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 48\n\t" \
5616*da0073e9SAndroid Build Coastguard Worker "sw $4, 16($29) \n\t" \
5617*da0073e9SAndroid Build Coastguard Worker "lw $4, 24(%1) \n\t" \
5618*da0073e9SAndroid Build Coastguard Worker "sw $4, 20($29) \n\t" \
5619*da0073e9SAndroid Build Coastguard Worker "lw $4, 28(%1) \n\t" \
5620*da0073e9SAndroid Build Coastguard Worker "sw $4, 24($29) \n\t" \
5621*da0073e9SAndroid Build Coastguard Worker "lw $4, 32(%1) \n\t" \
5622*da0073e9SAndroid Build Coastguard Worker "sw $4, 28($29) \n\t" \
5623*da0073e9SAndroid Build Coastguard Worker "lw $4, 36(%1) \n\t" \
5624*da0073e9SAndroid Build Coastguard Worker "sw $4, 32($29) \n\t" \
5625*da0073e9SAndroid Build Coastguard Worker "lw $4, 40(%1) \n\t" \
5626*da0073e9SAndroid Build Coastguard Worker "sw $4, 36($29) \n\t" \
5627*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5628*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5629*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5630*da0073e9SAndroid Build Coastguard Worker "lw $7, 16(%1) \n\t" \
5631*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5632*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5633*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 48 \n\t" \
5634*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5635*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5636*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5637*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5638*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5639*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5640*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5641*da0073e9SAndroid Build Coastguard Worker ); \
5642*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5643*da0073e9SAndroid Build Coastguard Worker } while (0)
5644*da0073e9SAndroid Build Coastguard Worker
5645*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
5646*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
5647*da0073e9SAndroid Build Coastguard Worker arg11) \
5648*da0073e9SAndroid Build Coastguard Worker do { \
5649*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5650*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[12]; \
5651*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5652*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5653*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5654*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5655*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5656*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5657*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5658*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5659*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
5660*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
5661*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
5662*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
5663*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
5664*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5665*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5666*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5667*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5668*da0073e9SAndroid Build Coastguard Worker "lw $4, 20(%1) \n\t" \
5669*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 48\n\t" \
5670*da0073e9SAndroid Build Coastguard Worker "sw $4, 16($29) \n\t" \
5671*da0073e9SAndroid Build Coastguard Worker "lw $4, 24(%1) \n\t" \
5672*da0073e9SAndroid Build Coastguard Worker "sw $4, 20($29) \n\t" \
5673*da0073e9SAndroid Build Coastguard Worker "lw $4, 28(%1) \n\t" \
5674*da0073e9SAndroid Build Coastguard Worker "sw $4, 24($29) \n\t" \
5675*da0073e9SAndroid Build Coastguard Worker "lw $4, 32(%1) \n\t" \
5676*da0073e9SAndroid Build Coastguard Worker "sw $4, 28($29) \n\t" \
5677*da0073e9SAndroid Build Coastguard Worker "lw $4, 36(%1) \n\t" \
5678*da0073e9SAndroid Build Coastguard Worker "sw $4, 32($29) \n\t" \
5679*da0073e9SAndroid Build Coastguard Worker "lw $4, 40(%1) \n\t" \
5680*da0073e9SAndroid Build Coastguard Worker "sw $4, 36($29) \n\t" \
5681*da0073e9SAndroid Build Coastguard Worker "lw $4, 44(%1) \n\t" \
5682*da0073e9SAndroid Build Coastguard Worker "sw $4, 40($29) \n\t" \
5683*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5684*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5685*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5686*da0073e9SAndroid Build Coastguard Worker "lw $7, 16(%1) \n\t" \
5687*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5688*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5689*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 48 \n\t" \
5690*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5691*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5692*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5693*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5694*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5695*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
5696*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5697*da0073e9SAndroid Build Coastguard Worker ); \
5698*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5699*da0073e9SAndroid Build Coastguard Worker } while (0)
5700*da0073e9SAndroid Build Coastguard Worker
5701*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
5702*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
5703*da0073e9SAndroid Build Coastguard Worker arg11,arg12) \
5704*da0073e9SAndroid Build Coastguard Worker do { \
5705*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5706*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[13]; \
5707*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5708*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5709*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5710*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5711*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5712*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5713*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5714*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5715*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
5716*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
5717*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
5718*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
5719*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
5720*da0073e9SAndroid Build Coastguard Worker _argvec[12] = (unsigned long)(arg12); \
5721*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5722*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 8 \n\t" \
5723*da0073e9SAndroid Build Coastguard Worker "sw $28, 0($29) \n\t" \
5724*da0073e9SAndroid Build Coastguard Worker "sw $31, 4($29) \n\t" \
5725*da0073e9SAndroid Build Coastguard Worker "lw $4, 20(%1) \n\t" \
5726*da0073e9SAndroid Build Coastguard Worker "subu $29, $29, 56\n\t" \
5727*da0073e9SAndroid Build Coastguard Worker "sw $4, 16($29) \n\t" \
5728*da0073e9SAndroid Build Coastguard Worker "lw $4, 24(%1) \n\t" \
5729*da0073e9SAndroid Build Coastguard Worker "sw $4, 20($29) \n\t" \
5730*da0073e9SAndroid Build Coastguard Worker "lw $4, 28(%1) \n\t" \
5731*da0073e9SAndroid Build Coastguard Worker "sw $4, 24($29) \n\t" \
5732*da0073e9SAndroid Build Coastguard Worker "lw $4, 32(%1) \n\t" \
5733*da0073e9SAndroid Build Coastguard Worker "sw $4, 28($29) \n\t" \
5734*da0073e9SAndroid Build Coastguard Worker "lw $4, 36(%1) \n\t" \
5735*da0073e9SAndroid Build Coastguard Worker "sw $4, 32($29) \n\t" \
5736*da0073e9SAndroid Build Coastguard Worker "lw $4, 40(%1) \n\t" \
5737*da0073e9SAndroid Build Coastguard Worker "sw $4, 36($29) \n\t" \
5738*da0073e9SAndroid Build Coastguard Worker "lw $4, 44(%1) \n\t" \
5739*da0073e9SAndroid Build Coastguard Worker "sw $4, 40($29) \n\t" \
5740*da0073e9SAndroid Build Coastguard Worker "lw $4, 48(%1) \n\t" \
5741*da0073e9SAndroid Build Coastguard Worker "sw $4, 44($29) \n\t" \
5742*da0073e9SAndroid Build Coastguard Worker "lw $4, 4(%1) \n\t" \
5743*da0073e9SAndroid Build Coastguard Worker "lw $5, 8(%1) \n\t" \
5744*da0073e9SAndroid Build Coastguard Worker "lw $6, 12(%1) \n\t" \
5745*da0073e9SAndroid Build Coastguard Worker "lw $7, 16(%1) \n\t" \
5746*da0073e9SAndroid Build Coastguard Worker "lw $25, 0(%1) \n\t" /* target->t9 */ \
5747*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5748*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 56 \n\t" \
5749*da0073e9SAndroid Build Coastguard Worker "lw $28, 0($29) \n\t" \
5750*da0073e9SAndroid Build Coastguard Worker "lw $31, 4($29) \n\t" \
5751*da0073e9SAndroid Build Coastguard Worker "addu $29, $29, 8 \n\t" \
5752*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
5753*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5754*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5755*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5756*da0073e9SAndroid Build Coastguard Worker ); \
5757*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5758*da0073e9SAndroid Build Coastguard Worker } while (0)
5759*da0073e9SAndroid Build Coastguard Worker
5760*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_mips32_linux */
5761*da0073e9SAndroid Build Coastguard Worker
5762*da0073e9SAndroid Build Coastguard Worker /* ------------------------- nanomips-linux -------------------- */
5763*da0073e9SAndroid Build Coastguard Worker
5764*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_nanomips_linux)
5765*da0073e9SAndroid Build Coastguard Worker
5766*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
5767*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "$t4", "$t5", "$a0", "$a1", "$a2", \
5768*da0073e9SAndroid Build Coastguard Worker "$a3", "$a4", "$a5", "$a6", "$a7", "$t0", "$t1", "$t2", "$t3", \
5769*da0073e9SAndroid Build Coastguard Worker "$t8","$t9", "$at"
5770*da0073e9SAndroid Build Coastguard Worker
5771*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned
5772*da0073e9SAndroid Build Coastguard Worker long) == 4. */
5773*da0073e9SAndroid Build Coastguard Worker
5774*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
5775*da0073e9SAndroid Build Coastguard Worker do { \
5776*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5777*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[1]; \
5778*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5779*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5780*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5781*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1)\n\t" \
5782*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5783*da0073e9SAndroid Build Coastguard Worker "move %0, $a0\n" \
5784*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5785*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5786*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5787*da0073e9SAndroid Build Coastguard Worker ); \
5788*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5789*da0073e9SAndroid Build Coastguard Worker } while (0)
5790*da0073e9SAndroid Build Coastguard Worker
5791*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
5792*da0073e9SAndroid Build Coastguard Worker do { \
5793*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5794*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[2]; \
5795*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5796*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5797*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5798*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5799*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1)\n\t" \
5800*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1)\n\t" \
5801*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5802*da0073e9SAndroid Build Coastguard Worker "move %0, $a0\n" \
5803*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5804*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5805*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5806*da0073e9SAndroid Build Coastguard Worker ); \
5807*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5808*da0073e9SAndroid Build Coastguard Worker } while (0)
5809*da0073e9SAndroid Build Coastguard Worker
5810*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
5811*da0073e9SAndroid Build Coastguard Worker do { \
5812*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5813*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[3]; \
5814*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5815*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5816*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5817*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5818*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5819*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1)\n\t" \
5820*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1)\n\t" \
5821*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1)\n\t" \
5822*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5823*da0073e9SAndroid Build Coastguard Worker "move %0, $a0\n" \
5824*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5825*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5826*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5827*da0073e9SAndroid Build Coastguard Worker ); \
5828*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5829*da0073e9SAndroid Build Coastguard Worker } while (0)
5830*da0073e9SAndroid Build Coastguard Worker
5831*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
5832*da0073e9SAndroid Build Coastguard Worker do { \
5833*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5834*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[4]; \
5835*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5836*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5837*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5838*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5839*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5840*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5841*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1)\n\t" \
5842*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1)\n\t" \
5843*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1)\n\t" \
5844*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1)\n\t" \
5845*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5846*da0073e9SAndroid Build Coastguard Worker "move %0, $a0\n" \
5847*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5848*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5849*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5850*da0073e9SAndroid Build Coastguard Worker ); \
5851*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5852*da0073e9SAndroid Build Coastguard Worker } while (0)
5853*da0073e9SAndroid Build Coastguard Worker
5854*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
5855*da0073e9SAndroid Build Coastguard Worker do { \
5856*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5857*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[5]; \
5858*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5859*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5860*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5861*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5862*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5863*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5864*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5865*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1)\n\t" \
5866*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1)\n\t" \
5867*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1)\n\t" \
5868*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1)\n\t" \
5869*da0073e9SAndroid Build Coastguard Worker "lw $a3,16(%1)\n\t" \
5870*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5871*da0073e9SAndroid Build Coastguard Worker "move %0, $a0\n" \
5872*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5873*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5874*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5875*da0073e9SAndroid Build Coastguard Worker ); \
5876*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5877*da0073e9SAndroid Build Coastguard Worker } while (0)
5878*da0073e9SAndroid Build Coastguard Worker
5879*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
5880*da0073e9SAndroid Build Coastguard Worker do { \
5881*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5882*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[6]; \
5883*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5884*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5885*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5886*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5887*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5888*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5889*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5890*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5891*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1)\n\t" \
5892*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1)\n\t" \
5893*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1)\n\t" \
5894*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1)\n\t" \
5895*da0073e9SAndroid Build Coastguard Worker "lw $a3,16(%1)\n\t" \
5896*da0073e9SAndroid Build Coastguard Worker "lw $a4,20(%1)\n\t" \
5897*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5898*da0073e9SAndroid Build Coastguard Worker "move %0, $a0\n" \
5899*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5900*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5901*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5902*da0073e9SAndroid Build Coastguard Worker ); \
5903*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5904*da0073e9SAndroid Build Coastguard Worker } while (0)
5905*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
5906*da0073e9SAndroid Build Coastguard Worker do { \
5907*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5908*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[7]; \
5909*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5910*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5911*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5912*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5913*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5914*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5915*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5916*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5917*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5918*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1)\n\t" \
5919*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1)\n\t" \
5920*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1)\n\t" \
5921*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1)\n\t" \
5922*da0073e9SAndroid Build Coastguard Worker "lw $a3,16(%1)\n\t" \
5923*da0073e9SAndroid Build Coastguard Worker "lw $a4,20(%1)\n\t" \
5924*da0073e9SAndroid Build Coastguard Worker "lw $a5,24(%1)\n\t" \
5925*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5926*da0073e9SAndroid Build Coastguard Worker "move %0, $a0\n" \
5927*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5928*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5929*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5930*da0073e9SAndroid Build Coastguard Worker ); \
5931*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5932*da0073e9SAndroid Build Coastguard Worker } while (0)
5933*da0073e9SAndroid Build Coastguard Worker
5934*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5935*da0073e9SAndroid Build Coastguard Worker arg7) \
5936*da0073e9SAndroid Build Coastguard Worker do { \
5937*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5938*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[8]; \
5939*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5940*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5941*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5942*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5943*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5944*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5945*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5946*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5947*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
5948*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5949*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1)\n\t" \
5950*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1)\n\t" \
5951*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1)\n\t" \
5952*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1)\n\t" \
5953*da0073e9SAndroid Build Coastguard Worker "lw $a3,16(%1)\n\t" \
5954*da0073e9SAndroid Build Coastguard Worker "lw $a4,20(%1)\n\t" \
5955*da0073e9SAndroid Build Coastguard Worker "lw $a5,24(%1)\n\t" \
5956*da0073e9SAndroid Build Coastguard Worker "lw $a6,28(%1)\n\t" \
5957*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5958*da0073e9SAndroid Build Coastguard Worker "move %0, $a0\n" \
5959*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5960*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5961*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5962*da0073e9SAndroid Build Coastguard Worker ); \
5963*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5964*da0073e9SAndroid Build Coastguard Worker } while (0)
5965*da0073e9SAndroid Build Coastguard Worker
5966*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5967*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
5968*da0073e9SAndroid Build Coastguard Worker do { \
5969*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
5970*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[9]; \
5971*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
5972*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
5973*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
5974*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
5975*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
5976*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
5977*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
5978*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
5979*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
5980*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
5981*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
5982*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1)\n\t" \
5983*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1)\n\t" \
5984*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1)\n\t" \
5985*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1)\n\t" \
5986*da0073e9SAndroid Build Coastguard Worker "lw $a3,16(%1)\n\t" \
5987*da0073e9SAndroid Build Coastguard Worker "lw $a4,20(%1)\n\t" \
5988*da0073e9SAndroid Build Coastguard Worker "lw $a5,24(%1)\n\t" \
5989*da0073e9SAndroid Build Coastguard Worker "lw $a6,28(%1)\n\t" \
5990*da0073e9SAndroid Build Coastguard Worker "lw $a7,32(%1)\n\t" \
5991*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
5992*da0073e9SAndroid Build Coastguard Worker "move %0, $a0\n" \
5993*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
5994*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
5995*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
5996*da0073e9SAndroid Build Coastguard Worker ); \
5997*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
5998*da0073e9SAndroid Build Coastguard Worker } while (0)
5999*da0073e9SAndroid Build Coastguard Worker
6000*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
6001*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
6002*da0073e9SAndroid Build Coastguard Worker do { \
6003*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6004*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[10]; \
6005*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
6006*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
6007*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
6008*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
6009*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
6010*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
6011*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
6012*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
6013*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
6014*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
6015*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
6016*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6017*da0073e9SAndroid Build Coastguard Worker "addiu $sp, $sp, -16 \n\t" \
6018*da0073e9SAndroid Build Coastguard Worker "lw $t9,36(%1) \n\t" \
6019*da0073e9SAndroid Build Coastguard Worker "sw $t9, 0($sp) \n\t" \
6020*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1) \n\t" \
6021*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1) \n\t" \
6022*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1) \n\t" \
6023*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1) \n\t" \
6024*da0073e9SAndroid Build Coastguard Worker "lw $a3,16(%1) \n\t" \
6025*da0073e9SAndroid Build Coastguard Worker "lw $a4,20(%1) \n\t" \
6026*da0073e9SAndroid Build Coastguard Worker "lw $a5,24(%1) \n\t" \
6027*da0073e9SAndroid Build Coastguard Worker "lw $a6,28(%1) \n\t" \
6028*da0073e9SAndroid Build Coastguard Worker "lw $a7,32(%1) \n\t" \
6029*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6030*da0073e9SAndroid Build Coastguard Worker "move %0, $a0 \n\t" \
6031*da0073e9SAndroid Build Coastguard Worker "addiu $sp, $sp, 16 \n\t" \
6032*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6033*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6034*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6035*da0073e9SAndroid Build Coastguard Worker ); \
6036*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
6037*da0073e9SAndroid Build Coastguard Worker } while (0)
6038*da0073e9SAndroid Build Coastguard Worker
6039*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
6040*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
6041*da0073e9SAndroid Build Coastguard Worker do { \
6042*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6043*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[11]; \
6044*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
6045*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
6046*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
6047*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
6048*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
6049*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
6050*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
6051*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
6052*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
6053*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
6054*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
6055*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
6056*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6057*da0073e9SAndroid Build Coastguard Worker "addiu $sp, $sp, -16 \n\t" \
6058*da0073e9SAndroid Build Coastguard Worker "lw $t9,36(%1) \n\t" \
6059*da0073e9SAndroid Build Coastguard Worker "sw $t9, 0($sp) \n\t" \
6060*da0073e9SAndroid Build Coastguard Worker "lw $t9,40(%1) \n\t" \
6061*da0073e9SAndroid Build Coastguard Worker "sw $t9, 4($sp) \n\t" \
6062*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1) \n\t" \
6063*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1) \n\t" \
6064*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1) \n\t" \
6065*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1) \n\t" \
6066*da0073e9SAndroid Build Coastguard Worker "lw $a3,16(%1) \n\t" \
6067*da0073e9SAndroid Build Coastguard Worker "lw $a4,20(%1) \n\t" \
6068*da0073e9SAndroid Build Coastguard Worker "lw $a5,24(%1) \n\t" \
6069*da0073e9SAndroid Build Coastguard Worker "lw $a6,28(%1) \n\t" \
6070*da0073e9SAndroid Build Coastguard Worker "lw $a7,32(%1) \n\t" \
6071*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6072*da0073e9SAndroid Build Coastguard Worker "move %0, $a0 \n\t" \
6073*da0073e9SAndroid Build Coastguard Worker "addiu $sp, $sp, 16 \n\t" \
6074*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6075*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6076*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6077*da0073e9SAndroid Build Coastguard Worker ); \
6078*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
6079*da0073e9SAndroid Build Coastguard Worker } while (0)
6080*da0073e9SAndroid Build Coastguard Worker
6081*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
6082*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
6083*da0073e9SAndroid Build Coastguard Worker arg11) \
6084*da0073e9SAndroid Build Coastguard Worker do { \
6085*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6086*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[12]; \
6087*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
6088*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
6089*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
6090*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
6091*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
6092*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
6093*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
6094*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
6095*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
6096*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
6097*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
6098*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
6099*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
6100*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6101*da0073e9SAndroid Build Coastguard Worker "addiu $sp, $sp, -16 \n\t" \
6102*da0073e9SAndroid Build Coastguard Worker "lw $t9,36(%1) \n\t" \
6103*da0073e9SAndroid Build Coastguard Worker "sw $t9, 0($sp) \n\t" \
6104*da0073e9SAndroid Build Coastguard Worker "lw $t9,40(%1) \n\t" \
6105*da0073e9SAndroid Build Coastguard Worker "sw $t9, 4($sp) \n\t" \
6106*da0073e9SAndroid Build Coastguard Worker "lw $t9,44(%1) \n\t" \
6107*da0073e9SAndroid Build Coastguard Worker "sw $t9, 8($sp) \n\t" \
6108*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1) \n\t" \
6109*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1) \n\t" \
6110*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1) \n\t" \
6111*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1) \n\t" \
6112*da0073e9SAndroid Build Coastguard Worker "lw $a3,16(%1) \n\t" \
6113*da0073e9SAndroid Build Coastguard Worker "lw $a4,20(%1) \n\t" \
6114*da0073e9SAndroid Build Coastguard Worker "lw $a5,24(%1) \n\t" \
6115*da0073e9SAndroid Build Coastguard Worker "lw $a6,28(%1) \n\t" \
6116*da0073e9SAndroid Build Coastguard Worker "lw $a7,32(%1) \n\t" \
6117*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6118*da0073e9SAndroid Build Coastguard Worker "move %0, $a0 \n\t" \
6119*da0073e9SAndroid Build Coastguard Worker "addiu $sp, $sp, 16 \n\t" \
6120*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6121*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6122*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6123*da0073e9SAndroid Build Coastguard Worker ); \
6124*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
6125*da0073e9SAndroid Build Coastguard Worker } while (0)
6126*da0073e9SAndroid Build Coastguard Worker
6127*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
6128*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
6129*da0073e9SAndroid Build Coastguard Worker arg11,arg12) \
6130*da0073e9SAndroid Build Coastguard Worker do { \
6131*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6132*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _argvec[13]; \
6133*da0073e9SAndroid Build Coastguard Worker volatile unsigned long _res; \
6134*da0073e9SAndroid Build Coastguard Worker _argvec[0] = (unsigned long)_orig.nraddr; \
6135*da0073e9SAndroid Build Coastguard Worker _argvec[1] = (unsigned long)(arg1); \
6136*da0073e9SAndroid Build Coastguard Worker _argvec[2] = (unsigned long)(arg2); \
6137*da0073e9SAndroid Build Coastguard Worker _argvec[3] = (unsigned long)(arg3); \
6138*da0073e9SAndroid Build Coastguard Worker _argvec[4] = (unsigned long)(arg4); \
6139*da0073e9SAndroid Build Coastguard Worker _argvec[5] = (unsigned long)(arg5); \
6140*da0073e9SAndroid Build Coastguard Worker _argvec[6] = (unsigned long)(arg6); \
6141*da0073e9SAndroid Build Coastguard Worker _argvec[7] = (unsigned long)(arg7); \
6142*da0073e9SAndroid Build Coastguard Worker _argvec[8] = (unsigned long)(arg8); \
6143*da0073e9SAndroid Build Coastguard Worker _argvec[9] = (unsigned long)(arg9); \
6144*da0073e9SAndroid Build Coastguard Worker _argvec[10] = (unsigned long)(arg10); \
6145*da0073e9SAndroid Build Coastguard Worker _argvec[11] = (unsigned long)(arg11); \
6146*da0073e9SAndroid Build Coastguard Worker _argvec[12] = (unsigned long)(arg12); \
6147*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6148*da0073e9SAndroid Build Coastguard Worker "addiu $sp, $sp, -16 \n\t" \
6149*da0073e9SAndroid Build Coastguard Worker "lw $t9,36(%1) \n\t" \
6150*da0073e9SAndroid Build Coastguard Worker "sw $t9, 0($sp) \n\t" \
6151*da0073e9SAndroid Build Coastguard Worker "lw $t9,40(%1) \n\t" \
6152*da0073e9SAndroid Build Coastguard Worker "sw $t9, 4($sp) \n\t" \
6153*da0073e9SAndroid Build Coastguard Worker "lw $t9,44(%1) \n\t" \
6154*da0073e9SAndroid Build Coastguard Worker "sw $t9, 8($sp) \n\t" \
6155*da0073e9SAndroid Build Coastguard Worker "lw $t9,48(%1) \n\t" \
6156*da0073e9SAndroid Build Coastguard Worker "sw $t9,12($sp) \n\t" \
6157*da0073e9SAndroid Build Coastguard Worker "lw $t9, 0(%1) \n\t" \
6158*da0073e9SAndroid Build Coastguard Worker "lw $a0, 4(%1) \n\t" \
6159*da0073e9SAndroid Build Coastguard Worker "lw $a1, 8(%1) \n\t" \
6160*da0073e9SAndroid Build Coastguard Worker "lw $a2,12(%1) \n\t" \
6161*da0073e9SAndroid Build Coastguard Worker "lw $a3,16(%1) \n\t" \
6162*da0073e9SAndroid Build Coastguard Worker "lw $a4,20(%1) \n\t" \
6163*da0073e9SAndroid Build Coastguard Worker "lw $a5,24(%1) \n\t" \
6164*da0073e9SAndroid Build Coastguard Worker "lw $a6,28(%1) \n\t" \
6165*da0073e9SAndroid Build Coastguard Worker "lw $a7,32(%1) \n\t" \
6166*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6167*da0073e9SAndroid Build Coastguard Worker "move %0, $a0 \n\t" \
6168*da0073e9SAndroid Build Coastguard Worker "addiu $sp, $sp, 16 \n\t" \
6169*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6170*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6171*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6172*da0073e9SAndroid Build Coastguard Worker ); \
6173*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) _res; \
6174*da0073e9SAndroid Build Coastguard Worker } while (0)
6175*da0073e9SAndroid Build Coastguard Worker
6176*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_nanomips_linux */
6177*da0073e9SAndroid Build Coastguard Worker
6178*da0073e9SAndroid Build Coastguard Worker /* ------------------------- mips64-linux ------------------------- */
6179*da0073e9SAndroid Build Coastguard Worker
6180*da0073e9SAndroid Build Coastguard Worker #if defined(PLAT_mips64_linux)
6181*da0073e9SAndroid Build Coastguard Worker
6182*da0073e9SAndroid Build Coastguard Worker /* These regs are trashed by the hidden call. */
6183*da0073e9SAndroid Build Coastguard Worker #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \
6184*da0073e9SAndroid Build Coastguard Worker "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
6185*da0073e9SAndroid Build Coastguard Worker "$25", "$31"
6186*da0073e9SAndroid Build Coastguard Worker
6187*da0073e9SAndroid Build Coastguard Worker /* These CALL_FN_ macros assume that on mips64-linux,
6188*da0073e9SAndroid Build Coastguard Worker sizeof(long long) == 8. */
6189*da0073e9SAndroid Build Coastguard Worker
6190*da0073e9SAndroid Build Coastguard Worker #define MIPS64_LONG2REG_CAST(x) ((long long)(long)x)
6191*da0073e9SAndroid Build Coastguard Worker
6192*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_v(lval, orig) \
6193*da0073e9SAndroid Build Coastguard Worker do { \
6194*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6195*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[1]; \
6196*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6197*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6198*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6199*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6200*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6201*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6202*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6203*da0073e9SAndroid Build Coastguard Worker : /*in*/ "0" (&_argvec[0]) \
6204*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6205*da0073e9SAndroid Build Coastguard Worker ); \
6206*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6207*da0073e9SAndroid Build Coastguard Worker } while (0)
6208*da0073e9SAndroid Build Coastguard Worker
6209*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_W(lval, orig, arg1) \
6210*da0073e9SAndroid Build Coastguard Worker do { \
6211*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6212*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[2]; \
6213*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6214*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6215*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6216*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6217*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" /* arg1*/ \
6218*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6219*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6220*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6221*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6222*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6223*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6224*da0073e9SAndroid Build Coastguard Worker ); \
6225*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6226*da0073e9SAndroid Build Coastguard Worker } while (0)
6227*da0073e9SAndroid Build Coastguard Worker
6228*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
6229*da0073e9SAndroid Build Coastguard Worker do { \
6230*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6231*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[3]; \
6232*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6233*da0073e9SAndroid Build Coastguard Worker _argvec[0] = _orig.nraddr; \
6234*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6235*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6236*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6237*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6238*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6239*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6240*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6241*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6242*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6243*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6244*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6245*da0073e9SAndroid Build Coastguard Worker ); \
6246*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6247*da0073e9SAndroid Build Coastguard Worker } while (0)
6248*da0073e9SAndroid Build Coastguard Worker
6249*da0073e9SAndroid Build Coastguard Worker
6250*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
6251*da0073e9SAndroid Build Coastguard Worker do { \
6252*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6253*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[4]; \
6254*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6255*da0073e9SAndroid Build Coastguard Worker _argvec[0] = _orig.nraddr; \
6256*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6257*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6258*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6259*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6260*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6261*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6262*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6263*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6264*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6265*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6266*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6267*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6268*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6269*da0073e9SAndroid Build Coastguard Worker ); \
6270*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6271*da0073e9SAndroid Build Coastguard Worker } while (0)
6272*da0073e9SAndroid Build Coastguard Worker
6273*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
6274*da0073e9SAndroid Build Coastguard Worker do { \
6275*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6276*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[5]; \
6277*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6278*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6279*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6280*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6281*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6282*da0073e9SAndroid Build Coastguard Worker _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \
6283*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6284*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6285*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6286*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6287*da0073e9SAndroid Build Coastguard Worker "ld $7, 32(%1)\n\t" \
6288*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6289*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6290*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6291*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6292*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6293*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6294*da0073e9SAndroid Build Coastguard Worker ); \
6295*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6296*da0073e9SAndroid Build Coastguard Worker } while (0)
6297*da0073e9SAndroid Build Coastguard Worker
6298*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
6299*da0073e9SAndroid Build Coastguard Worker do { \
6300*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6301*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[6]; \
6302*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6303*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6304*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6305*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6306*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6307*da0073e9SAndroid Build Coastguard Worker _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \
6308*da0073e9SAndroid Build Coastguard Worker _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \
6309*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6310*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6311*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6312*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6313*da0073e9SAndroid Build Coastguard Worker "ld $7, 32(%1)\n\t" \
6314*da0073e9SAndroid Build Coastguard Worker "ld $8, 40(%1)\n\t" \
6315*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6316*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6317*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6318*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6319*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6320*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6321*da0073e9SAndroid Build Coastguard Worker ); \
6322*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6323*da0073e9SAndroid Build Coastguard Worker } while (0)
6324*da0073e9SAndroid Build Coastguard Worker
6325*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
6326*da0073e9SAndroid Build Coastguard Worker do { \
6327*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6328*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[7]; \
6329*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6330*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6331*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6332*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6333*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6334*da0073e9SAndroid Build Coastguard Worker _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \
6335*da0073e9SAndroid Build Coastguard Worker _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \
6336*da0073e9SAndroid Build Coastguard Worker _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \
6337*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6338*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6339*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6340*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6341*da0073e9SAndroid Build Coastguard Worker "ld $7, 32(%1)\n\t" \
6342*da0073e9SAndroid Build Coastguard Worker "ld $8, 40(%1)\n\t" \
6343*da0073e9SAndroid Build Coastguard Worker "ld $9, 48(%1)\n\t" \
6344*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6345*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6346*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6347*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6348*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6349*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6350*da0073e9SAndroid Build Coastguard Worker ); \
6351*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6352*da0073e9SAndroid Build Coastguard Worker } while (0)
6353*da0073e9SAndroid Build Coastguard Worker
6354*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
6355*da0073e9SAndroid Build Coastguard Worker arg7) \
6356*da0073e9SAndroid Build Coastguard Worker do { \
6357*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6358*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[8]; \
6359*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6360*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6361*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6362*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6363*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6364*da0073e9SAndroid Build Coastguard Worker _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \
6365*da0073e9SAndroid Build Coastguard Worker _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \
6366*da0073e9SAndroid Build Coastguard Worker _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \
6367*da0073e9SAndroid Build Coastguard Worker _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \
6368*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6369*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6370*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6371*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6372*da0073e9SAndroid Build Coastguard Worker "ld $7, 32(%1)\n\t" \
6373*da0073e9SAndroid Build Coastguard Worker "ld $8, 40(%1)\n\t" \
6374*da0073e9SAndroid Build Coastguard Worker "ld $9, 48(%1)\n\t" \
6375*da0073e9SAndroid Build Coastguard Worker "ld $10, 56(%1)\n\t" \
6376*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1) \n\t" /* target->t9 */ \
6377*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6378*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6379*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6380*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6381*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6382*da0073e9SAndroid Build Coastguard Worker ); \
6383*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6384*da0073e9SAndroid Build Coastguard Worker } while (0)
6385*da0073e9SAndroid Build Coastguard Worker
6386*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
6387*da0073e9SAndroid Build Coastguard Worker arg7,arg8) \
6388*da0073e9SAndroid Build Coastguard Worker do { \
6389*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6390*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[9]; \
6391*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6392*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6393*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6394*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6395*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6396*da0073e9SAndroid Build Coastguard Worker _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \
6397*da0073e9SAndroid Build Coastguard Worker _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \
6398*da0073e9SAndroid Build Coastguard Worker _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \
6399*da0073e9SAndroid Build Coastguard Worker _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \
6400*da0073e9SAndroid Build Coastguard Worker _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \
6401*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6402*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6403*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6404*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6405*da0073e9SAndroid Build Coastguard Worker "ld $7, 32(%1)\n\t" \
6406*da0073e9SAndroid Build Coastguard Worker "ld $8, 40(%1)\n\t" \
6407*da0073e9SAndroid Build Coastguard Worker "ld $9, 48(%1)\n\t" \
6408*da0073e9SAndroid Build Coastguard Worker "ld $10, 56(%1)\n\t" \
6409*da0073e9SAndroid Build Coastguard Worker "ld $11, 64(%1)\n\t" \
6410*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1) \n\t" /* target->t9 */ \
6411*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6412*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6413*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6414*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6415*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6416*da0073e9SAndroid Build Coastguard Worker ); \
6417*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6418*da0073e9SAndroid Build Coastguard Worker } while (0)
6419*da0073e9SAndroid Build Coastguard Worker
6420*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
6421*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9) \
6422*da0073e9SAndroid Build Coastguard Worker do { \
6423*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6424*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[10]; \
6425*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6426*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6427*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6428*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6429*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6430*da0073e9SAndroid Build Coastguard Worker _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \
6431*da0073e9SAndroid Build Coastguard Worker _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \
6432*da0073e9SAndroid Build Coastguard Worker _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \
6433*da0073e9SAndroid Build Coastguard Worker _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \
6434*da0073e9SAndroid Build Coastguard Worker _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \
6435*da0073e9SAndroid Build Coastguard Worker _argvec[9] = MIPS64_LONG2REG_CAST(arg9); \
6436*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6437*da0073e9SAndroid Build Coastguard Worker "dsubu $29, $29, 8\n\t" \
6438*da0073e9SAndroid Build Coastguard Worker "ld $4, 72(%1)\n\t" \
6439*da0073e9SAndroid Build Coastguard Worker "sd $4, 0($29)\n\t" \
6440*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6441*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6442*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6443*da0073e9SAndroid Build Coastguard Worker "ld $7, 32(%1)\n\t" \
6444*da0073e9SAndroid Build Coastguard Worker "ld $8, 40(%1)\n\t" \
6445*da0073e9SAndroid Build Coastguard Worker "ld $9, 48(%1)\n\t" \
6446*da0073e9SAndroid Build Coastguard Worker "ld $10, 56(%1)\n\t" \
6447*da0073e9SAndroid Build Coastguard Worker "ld $11, 64(%1)\n\t" \
6448*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6449*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6450*da0073e9SAndroid Build Coastguard Worker "daddu $29, $29, 8\n\t" \
6451*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6452*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6453*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6454*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6455*da0073e9SAndroid Build Coastguard Worker ); \
6456*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6457*da0073e9SAndroid Build Coastguard Worker } while (0)
6458*da0073e9SAndroid Build Coastguard Worker
6459*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
6460*da0073e9SAndroid Build Coastguard Worker arg7,arg8,arg9,arg10) \
6461*da0073e9SAndroid Build Coastguard Worker do { \
6462*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6463*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[11]; \
6464*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6465*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6466*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6467*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6468*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6469*da0073e9SAndroid Build Coastguard Worker _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \
6470*da0073e9SAndroid Build Coastguard Worker _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \
6471*da0073e9SAndroid Build Coastguard Worker _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \
6472*da0073e9SAndroid Build Coastguard Worker _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \
6473*da0073e9SAndroid Build Coastguard Worker _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \
6474*da0073e9SAndroid Build Coastguard Worker _argvec[9] = MIPS64_LONG2REG_CAST(arg9); \
6475*da0073e9SAndroid Build Coastguard Worker _argvec[10] = MIPS64_LONG2REG_CAST(arg10); \
6476*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6477*da0073e9SAndroid Build Coastguard Worker "dsubu $29, $29, 16\n\t" \
6478*da0073e9SAndroid Build Coastguard Worker "ld $4, 72(%1)\n\t" \
6479*da0073e9SAndroid Build Coastguard Worker "sd $4, 0($29)\n\t" \
6480*da0073e9SAndroid Build Coastguard Worker "ld $4, 80(%1)\n\t" \
6481*da0073e9SAndroid Build Coastguard Worker "sd $4, 8($29)\n\t" \
6482*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6483*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6484*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6485*da0073e9SAndroid Build Coastguard Worker "ld $7, 32(%1)\n\t" \
6486*da0073e9SAndroid Build Coastguard Worker "ld $8, 40(%1)\n\t" \
6487*da0073e9SAndroid Build Coastguard Worker "ld $9, 48(%1)\n\t" \
6488*da0073e9SAndroid Build Coastguard Worker "ld $10, 56(%1)\n\t" \
6489*da0073e9SAndroid Build Coastguard Worker "ld $11, 64(%1)\n\t" \
6490*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6491*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6492*da0073e9SAndroid Build Coastguard Worker "daddu $29, $29, 16\n\t" \
6493*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6494*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6495*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6496*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6497*da0073e9SAndroid Build Coastguard Worker ); \
6498*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6499*da0073e9SAndroid Build Coastguard Worker } while (0)
6500*da0073e9SAndroid Build Coastguard Worker
6501*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
6502*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
6503*da0073e9SAndroid Build Coastguard Worker arg11) \
6504*da0073e9SAndroid Build Coastguard Worker do { \
6505*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6506*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[12]; \
6507*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6508*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6509*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6510*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6511*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6512*da0073e9SAndroid Build Coastguard Worker _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \
6513*da0073e9SAndroid Build Coastguard Worker _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \
6514*da0073e9SAndroid Build Coastguard Worker _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \
6515*da0073e9SAndroid Build Coastguard Worker _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \
6516*da0073e9SAndroid Build Coastguard Worker _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \
6517*da0073e9SAndroid Build Coastguard Worker _argvec[9] = MIPS64_LONG2REG_CAST(arg9); \
6518*da0073e9SAndroid Build Coastguard Worker _argvec[10] = MIPS64_LONG2REG_CAST(arg10); \
6519*da0073e9SAndroid Build Coastguard Worker _argvec[11] = MIPS64_LONG2REG_CAST(arg11); \
6520*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6521*da0073e9SAndroid Build Coastguard Worker "dsubu $29, $29, 24\n\t" \
6522*da0073e9SAndroid Build Coastguard Worker "ld $4, 72(%1)\n\t" \
6523*da0073e9SAndroid Build Coastguard Worker "sd $4, 0($29)\n\t" \
6524*da0073e9SAndroid Build Coastguard Worker "ld $4, 80(%1)\n\t" \
6525*da0073e9SAndroid Build Coastguard Worker "sd $4, 8($29)\n\t" \
6526*da0073e9SAndroid Build Coastguard Worker "ld $4, 88(%1)\n\t" \
6527*da0073e9SAndroid Build Coastguard Worker "sd $4, 16($29)\n\t" \
6528*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6529*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6530*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6531*da0073e9SAndroid Build Coastguard Worker "ld $7, 32(%1)\n\t" \
6532*da0073e9SAndroid Build Coastguard Worker "ld $8, 40(%1)\n\t" \
6533*da0073e9SAndroid Build Coastguard Worker "ld $9, 48(%1)\n\t" \
6534*da0073e9SAndroid Build Coastguard Worker "ld $10, 56(%1)\n\t" \
6535*da0073e9SAndroid Build Coastguard Worker "ld $11, 64(%1)\n\t" \
6536*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6537*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6538*da0073e9SAndroid Build Coastguard Worker "daddu $29, $29, 24\n\t" \
6539*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6540*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6541*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6542*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6543*da0073e9SAndroid Build Coastguard Worker ); \
6544*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6545*da0073e9SAndroid Build Coastguard Worker } while (0)
6546*da0073e9SAndroid Build Coastguard Worker
6547*da0073e9SAndroid Build Coastguard Worker #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
6548*da0073e9SAndroid Build Coastguard Worker arg6,arg7,arg8,arg9,arg10, \
6549*da0073e9SAndroid Build Coastguard Worker arg11,arg12) \
6550*da0073e9SAndroid Build Coastguard Worker do { \
6551*da0073e9SAndroid Build Coastguard Worker volatile OrigFn _orig = (orig); \
6552*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _argvec[13]; \
6553*da0073e9SAndroid Build Coastguard Worker volatile unsigned long long _res; \
6554*da0073e9SAndroid Build Coastguard Worker _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \
6555*da0073e9SAndroid Build Coastguard Worker _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \
6556*da0073e9SAndroid Build Coastguard Worker _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \
6557*da0073e9SAndroid Build Coastguard Worker _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \
6558*da0073e9SAndroid Build Coastguard Worker _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \
6559*da0073e9SAndroid Build Coastguard Worker _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \
6560*da0073e9SAndroid Build Coastguard Worker _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \
6561*da0073e9SAndroid Build Coastguard Worker _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \
6562*da0073e9SAndroid Build Coastguard Worker _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \
6563*da0073e9SAndroid Build Coastguard Worker _argvec[9] = MIPS64_LONG2REG_CAST(arg9); \
6564*da0073e9SAndroid Build Coastguard Worker _argvec[10] = MIPS64_LONG2REG_CAST(arg10); \
6565*da0073e9SAndroid Build Coastguard Worker _argvec[11] = MIPS64_LONG2REG_CAST(arg11); \
6566*da0073e9SAndroid Build Coastguard Worker _argvec[12] = MIPS64_LONG2REG_CAST(arg12); \
6567*da0073e9SAndroid Build Coastguard Worker __asm__ volatile( \
6568*da0073e9SAndroid Build Coastguard Worker "dsubu $29, $29, 32\n\t" \
6569*da0073e9SAndroid Build Coastguard Worker "ld $4, 72(%1)\n\t" \
6570*da0073e9SAndroid Build Coastguard Worker "sd $4, 0($29)\n\t" \
6571*da0073e9SAndroid Build Coastguard Worker "ld $4, 80(%1)\n\t" \
6572*da0073e9SAndroid Build Coastguard Worker "sd $4, 8($29)\n\t" \
6573*da0073e9SAndroid Build Coastguard Worker "ld $4, 88(%1)\n\t" \
6574*da0073e9SAndroid Build Coastguard Worker "sd $4, 16($29)\n\t" \
6575*da0073e9SAndroid Build Coastguard Worker "ld $4, 96(%1)\n\t" \
6576*da0073e9SAndroid Build Coastguard Worker "sd $4, 24($29)\n\t" \
6577*da0073e9SAndroid Build Coastguard Worker "ld $4, 8(%1)\n\t" \
6578*da0073e9SAndroid Build Coastguard Worker "ld $5, 16(%1)\n\t" \
6579*da0073e9SAndroid Build Coastguard Worker "ld $6, 24(%1)\n\t" \
6580*da0073e9SAndroid Build Coastguard Worker "ld $7, 32(%1)\n\t" \
6581*da0073e9SAndroid Build Coastguard Worker "ld $8, 40(%1)\n\t" \
6582*da0073e9SAndroid Build Coastguard Worker "ld $9, 48(%1)\n\t" \
6583*da0073e9SAndroid Build Coastguard Worker "ld $10, 56(%1)\n\t" \
6584*da0073e9SAndroid Build Coastguard Worker "ld $11, 64(%1)\n\t" \
6585*da0073e9SAndroid Build Coastguard Worker "ld $25, 0(%1)\n\t" /* target->t9 */ \
6586*da0073e9SAndroid Build Coastguard Worker VALGRIND_CALL_NOREDIR_T9 \
6587*da0073e9SAndroid Build Coastguard Worker "daddu $29, $29, 32\n\t" \
6588*da0073e9SAndroid Build Coastguard Worker "move %0, $2\n" \
6589*da0073e9SAndroid Build Coastguard Worker : /*out*/ "=r" (_res) \
6590*da0073e9SAndroid Build Coastguard Worker : /*in*/ "r" (&_argvec[0]) \
6591*da0073e9SAndroid Build Coastguard Worker : /*trash*/ "memory", __CALLER_SAVED_REGS \
6592*da0073e9SAndroid Build Coastguard Worker ); \
6593*da0073e9SAndroid Build Coastguard Worker lval = (__typeof__(lval)) (long)_res; \
6594*da0073e9SAndroid Build Coastguard Worker } while (0)
6595*da0073e9SAndroid Build Coastguard Worker
6596*da0073e9SAndroid Build Coastguard Worker #endif /* PLAT_mips64_linux */
6597*da0073e9SAndroid Build Coastguard Worker
6598*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
6599*da0073e9SAndroid Build Coastguard Worker /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */
6600*da0073e9SAndroid Build Coastguard Worker /* */
6601*da0073e9SAndroid Build Coastguard Worker /* ------------------------------------------------------------------ */
6602*da0073e9SAndroid Build Coastguard Worker
6603*da0073e9SAndroid Build Coastguard Worker /* Some request codes. There are many more of these, but most are not
6604*da0073e9SAndroid Build Coastguard Worker exposed to end-user view. These are the public ones, all of the
6605*da0073e9SAndroid Build Coastguard Worker form 0x1000 + small_number.
6606*da0073e9SAndroid Build Coastguard Worker
6607*da0073e9SAndroid Build Coastguard Worker Core ones are in the range 0x00000000--0x0000ffff. The non-public
6608*da0073e9SAndroid Build Coastguard Worker ones start at 0x2000.
6609*da0073e9SAndroid Build Coastguard Worker */
6610*da0073e9SAndroid Build Coastguard Worker
6611*da0073e9SAndroid Build Coastguard Worker /* These macros are used by tools -- they must be public, but don't
6612*da0073e9SAndroid Build Coastguard Worker embed them into other programs. */
6613*da0073e9SAndroid Build Coastguard Worker #define VG_USERREQ_TOOL_BASE(a,b) \
6614*da0073e9SAndroid Build Coastguard Worker ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
6615*da0073e9SAndroid Build Coastguard Worker #define VG_IS_TOOL_USERREQ(a, b, v) \
6616*da0073e9SAndroid Build Coastguard Worker (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
6617*da0073e9SAndroid Build Coastguard Worker
6618*da0073e9SAndroid Build Coastguard Worker /* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
6619*da0073e9SAndroid Build Coastguard Worker This enum comprises an ABI exported by Valgrind to programs
6620*da0073e9SAndroid Build Coastguard Worker which use client requests. DO NOT CHANGE THE NUMERIC VALUES OF THESE
6621*da0073e9SAndroid Build Coastguard Worker ENTRIES, NOR DELETE ANY -- add new ones at the end of the most
6622*da0073e9SAndroid Build Coastguard Worker relevant group. */
6623*da0073e9SAndroid Build Coastguard Worker typedef
6624*da0073e9SAndroid Build Coastguard Worker enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
6625*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
6626*da0073e9SAndroid Build Coastguard Worker
6627*da0073e9SAndroid Build Coastguard Worker /* These allow any function to be called from the simulated
6628*da0073e9SAndroid Build Coastguard Worker CPU but run on the real CPU. Nb: the first arg passed to
6629*da0073e9SAndroid Build Coastguard Worker the function is always the ThreadId of the running
6630*da0073e9SAndroid Build Coastguard Worker thread! So CLIENT_CALL0 actually requires a 1 arg
6631*da0073e9SAndroid Build Coastguard Worker function, etc. */
6632*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CLIENT_CALL0 = 0x1101,
6633*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CLIENT_CALL1 = 0x1102,
6634*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CLIENT_CALL2 = 0x1103,
6635*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CLIENT_CALL3 = 0x1104,
6636*da0073e9SAndroid Build Coastguard Worker
6637*da0073e9SAndroid Build Coastguard Worker /* Can be useful in regression testing suites -- eg. can
6638*da0073e9SAndroid Build Coastguard Worker send Valgrind's output to /dev/null and still count
6639*da0073e9SAndroid Build Coastguard Worker errors. */
6640*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__COUNT_ERRORS = 0x1201,
6641*da0073e9SAndroid Build Coastguard Worker
6642*da0073e9SAndroid Build Coastguard Worker /* Allows the client program and/or gdbserver to execute a monitor
6643*da0073e9SAndroid Build Coastguard Worker command. */
6644*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202,
6645*da0073e9SAndroid Build Coastguard Worker
6646*da0073e9SAndroid Build Coastguard Worker /* Allows the client program to change a dynamic command line
6647*da0073e9SAndroid Build Coastguard Worker option. */
6648*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CLO_CHANGE = 0x1203,
6649*da0073e9SAndroid Build Coastguard Worker
6650*da0073e9SAndroid Build Coastguard Worker /* These are useful and can be interpreted by any tool that
6651*da0073e9SAndroid Build Coastguard Worker tracks malloc() et al, by using vg_replace_malloc.c. */
6652*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
6653*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__RESIZEINPLACE_BLOCK = 0x130b,
6654*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__FREELIKE_BLOCK = 0x1302,
6655*da0073e9SAndroid Build Coastguard Worker /* Memory pool support. */
6656*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CREATE_MEMPOOL = 0x1303,
6657*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__DESTROY_MEMPOOL = 0x1304,
6658*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MEMPOOL_ALLOC = 0x1305,
6659*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MEMPOOL_FREE = 0x1306,
6660*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MEMPOOL_TRIM = 0x1307,
6661*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MOVE_MEMPOOL = 0x1308,
6662*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MEMPOOL_CHANGE = 0x1309,
6663*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MEMPOOL_EXISTS = 0x130a,
6664*da0073e9SAndroid Build Coastguard Worker
6665*da0073e9SAndroid Build Coastguard Worker /* Allow printfs to valgrind log. */
6666*da0073e9SAndroid Build Coastguard Worker /* The first two pass the va_list argument by value, which
6667*da0073e9SAndroid Build Coastguard Worker assumes it is the same size as or smaller than a UWord,
6668*da0073e9SAndroid Build Coastguard Worker which generally isn't the case. Hence are deprecated.
6669*da0073e9SAndroid Build Coastguard Worker The second two pass the vargs by reference and so are
6670*da0073e9SAndroid Build Coastguard Worker immune to this problem. */
6671*da0073e9SAndroid Build Coastguard Worker /* both :: char* fmt, va_list vargs (DEPRECATED) */
6672*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__PRINTF = 0x1401,
6673*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
6674*da0073e9SAndroid Build Coastguard Worker /* both :: char* fmt, va_list* vargs */
6675*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403,
6676*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404,
6677*da0073e9SAndroid Build Coastguard Worker
6678*da0073e9SAndroid Build Coastguard Worker /* Stack support. */
6679*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__STACK_REGISTER = 0x1501,
6680*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__STACK_DEREGISTER = 0x1502,
6681*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__STACK_CHANGE = 0x1503,
6682*da0073e9SAndroid Build Coastguard Worker
6683*da0073e9SAndroid Build Coastguard Worker /* Wine support */
6684*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601,
6685*da0073e9SAndroid Build Coastguard Worker
6686*da0073e9SAndroid Build Coastguard Worker /* Querying of debug info. */
6687*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701,
6688*da0073e9SAndroid Build Coastguard Worker
6689*da0073e9SAndroid Build Coastguard Worker /* Disable/enable error reporting level. Takes a single
6690*da0073e9SAndroid Build Coastguard Worker Word arg which is the delta to this thread's error
6691*da0073e9SAndroid Build Coastguard Worker disablement indicator. Hence 1 disables or further
6692*da0073e9SAndroid Build Coastguard Worker disables errors, and -1 moves back towards enablement.
6693*da0073e9SAndroid Build Coastguard Worker Other values are not allowed. */
6694*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801,
6695*da0073e9SAndroid Build Coastguard Worker
6696*da0073e9SAndroid Build Coastguard Worker /* Some requests used for Valgrind internal, such as
6697*da0073e9SAndroid Build Coastguard Worker self-test or self-hosting. */
6698*da0073e9SAndroid Build Coastguard Worker /* Initialise IR injection */
6699*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901,
6700*da0073e9SAndroid Build Coastguard Worker /* Used by Inner Valgrind to inform Outer Valgrind where to
6701*da0073e9SAndroid Build Coastguard Worker find the list of inner guest threads */
6702*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__INNER_THREADS = 0x1902
6703*da0073e9SAndroid Build Coastguard Worker } Vg_ClientRequest;
6704*da0073e9SAndroid Build Coastguard Worker
6705*da0073e9SAndroid Build Coastguard Worker #if !defined(__GNUC__)
6706*da0073e9SAndroid Build Coastguard Worker # define __extension__ /* */
6707*da0073e9SAndroid Build Coastguard Worker #endif
6708*da0073e9SAndroid Build Coastguard Worker
6709*da0073e9SAndroid Build Coastguard Worker
6710*da0073e9SAndroid Build Coastguard Worker /* Returns the number of Valgrinds this code is running under. That
6711*da0073e9SAndroid Build Coastguard Worker is, 0 if running natively, 1 if running under Valgrind, 2 if
6712*da0073e9SAndroid Build Coastguard Worker running under Valgrind which is running under another Valgrind,
6713*da0073e9SAndroid Build Coastguard Worker etc. */
6714*da0073e9SAndroid Build Coastguard Worker #define RUNNING_ON_VALGRIND \
6715*da0073e9SAndroid Build Coastguard Worker (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */, \
6716*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__RUNNING_ON_VALGRIND, \
6717*da0073e9SAndroid Build Coastguard Worker 0, 0, 0, 0, 0) \
6718*da0073e9SAndroid Build Coastguard Worker
6719*da0073e9SAndroid Build Coastguard Worker
6720*da0073e9SAndroid Build Coastguard Worker /* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
6721*da0073e9SAndroid Build Coastguard Worker _qzz_len - 1]. Useful if you are debugging a JITter or some such,
6722*da0073e9SAndroid Build Coastguard Worker since it provides a way to make sure valgrind will retranslate the
6723*da0073e9SAndroid Build Coastguard Worker invalidated area. Returns no value. */
6724*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
6725*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS, \
6726*da0073e9SAndroid Build Coastguard Worker _qzz_addr, _qzz_len, 0, 0, 0)
6727*da0073e9SAndroid Build Coastguard Worker
6728*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_INNER_THREADS(_qzz_addr) \
6729*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__INNER_THREADS, \
6730*da0073e9SAndroid Build Coastguard Worker _qzz_addr, 0, 0, 0, 0)
6731*da0073e9SAndroid Build Coastguard Worker
6732*da0073e9SAndroid Build Coastguard Worker
6733*da0073e9SAndroid Build Coastguard Worker /* These requests are for getting Valgrind itself to print something.
6734*da0073e9SAndroid Build Coastguard Worker Possibly with a backtrace. This is a really ugly hack. The return value
6735*da0073e9SAndroid Build Coastguard Worker is the number of characters printed, excluding the "**<pid>** " part at the
6736*da0073e9SAndroid Build Coastguard Worker start and the backtrace (if present). */
6737*da0073e9SAndroid Build Coastguard Worker
6738*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
6739*da0073e9SAndroid Build Coastguard Worker /* Modern GCC will optimize the static routine out if unused,
6740*da0073e9SAndroid Build Coastguard Worker and unused attribute will shut down warnings about it. */
6741*da0073e9SAndroid Build Coastguard Worker static int VALGRIND_PRINTF(const char *format, ...)
6742*da0073e9SAndroid Build Coastguard Worker __attribute__((format(__printf__, 1, 2), __unused__));
6743*da0073e9SAndroid Build Coastguard Worker #endif
6744*da0073e9SAndroid Build Coastguard Worker static int
6745*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER)
6746*da0073e9SAndroid Build Coastguard Worker __inline
6747*da0073e9SAndroid Build Coastguard Worker #endif
VALGRIND_PRINTF(const char * format,...)6748*da0073e9SAndroid Build Coastguard Worker VALGRIND_PRINTF(const char *format, ...)
6749*da0073e9SAndroid Build Coastguard Worker {
6750*da0073e9SAndroid Build Coastguard Worker #if defined(NVALGRIND)
6751*da0073e9SAndroid Build Coastguard Worker (void)format;
6752*da0073e9SAndroid Build Coastguard Worker return 0;
6753*da0073e9SAndroid Build Coastguard Worker #else /* NVALGRIND */
6754*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW64__)
6755*da0073e9SAndroid Build Coastguard Worker uintptr_t _qzz_res;
6756*da0073e9SAndroid Build Coastguard Worker #else
6757*da0073e9SAndroid Build Coastguard Worker unsigned long _qzz_res;
6758*da0073e9SAndroid Build Coastguard Worker #endif
6759*da0073e9SAndroid Build Coastguard Worker va_list vargs;
6760*da0073e9SAndroid Build Coastguard Worker va_start(vargs, format);
6761*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW64__)
6762*da0073e9SAndroid Build Coastguard Worker _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6763*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__PRINTF_VALIST_BY_REF,
6764*da0073e9SAndroid Build Coastguard Worker (uintptr_t)format,
6765*da0073e9SAndroid Build Coastguard Worker (uintptr_t)&vargs,
6766*da0073e9SAndroid Build Coastguard Worker 0, 0, 0);
6767*da0073e9SAndroid Build Coastguard Worker #else
6768*da0073e9SAndroid Build Coastguard Worker _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6769*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__PRINTF_VALIST_BY_REF,
6770*da0073e9SAndroid Build Coastguard Worker (unsigned long)format,
6771*da0073e9SAndroid Build Coastguard Worker (unsigned long)&vargs,
6772*da0073e9SAndroid Build Coastguard Worker 0, 0, 0);
6773*da0073e9SAndroid Build Coastguard Worker #endif
6774*da0073e9SAndroid Build Coastguard Worker va_end(vargs);
6775*da0073e9SAndroid Build Coastguard Worker return (int)_qzz_res;
6776*da0073e9SAndroid Build Coastguard Worker #endif /* NVALGRIND */
6777*da0073e9SAndroid Build Coastguard Worker }
6778*da0073e9SAndroid Build Coastguard Worker
6779*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
6780*da0073e9SAndroid Build Coastguard Worker static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
6781*da0073e9SAndroid Build Coastguard Worker __attribute__((format(__printf__, 1, 2), __unused__));
6782*da0073e9SAndroid Build Coastguard Worker #endif
6783*da0073e9SAndroid Build Coastguard Worker static int
6784*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER)
6785*da0073e9SAndroid Build Coastguard Worker __inline
6786*da0073e9SAndroid Build Coastguard Worker #endif
VALGRIND_PRINTF_BACKTRACE(const char * format,...)6787*da0073e9SAndroid Build Coastguard Worker VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
6788*da0073e9SAndroid Build Coastguard Worker {
6789*da0073e9SAndroid Build Coastguard Worker #if defined(NVALGRIND)
6790*da0073e9SAndroid Build Coastguard Worker (void)format;
6791*da0073e9SAndroid Build Coastguard Worker return 0;
6792*da0073e9SAndroid Build Coastguard Worker #else /* NVALGRIND */
6793*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW64__)
6794*da0073e9SAndroid Build Coastguard Worker uintptr_t _qzz_res;
6795*da0073e9SAndroid Build Coastguard Worker #else
6796*da0073e9SAndroid Build Coastguard Worker unsigned long _qzz_res;
6797*da0073e9SAndroid Build Coastguard Worker #endif
6798*da0073e9SAndroid Build Coastguard Worker va_list vargs;
6799*da0073e9SAndroid Build Coastguard Worker va_start(vargs, format);
6800*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW64__)
6801*da0073e9SAndroid Build Coastguard Worker _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6802*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
6803*da0073e9SAndroid Build Coastguard Worker (uintptr_t)format,
6804*da0073e9SAndroid Build Coastguard Worker (uintptr_t)&vargs,
6805*da0073e9SAndroid Build Coastguard Worker 0, 0, 0);
6806*da0073e9SAndroid Build Coastguard Worker #else
6807*da0073e9SAndroid Build Coastguard Worker _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6808*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
6809*da0073e9SAndroid Build Coastguard Worker (unsigned long)format,
6810*da0073e9SAndroid Build Coastguard Worker (unsigned long)&vargs,
6811*da0073e9SAndroid Build Coastguard Worker 0, 0, 0);
6812*da0073e9SAndroid Build Coastguard Worker #endif
6813*da0073e9SAndroid Build Coastguard Worker va_end(vargs);
6814*da0073e9SAndroid Build Coastguard Worker return (int)_qzz_res;
6815*da0073e9SAndroid Build Coastguard Worker #endif /* NVALGRIND */
6816*da0073e9SAndroid Build Coastguard Worker }
6817*da0073e9SAndroid Build Coastguard Worker
6818*da0073e9SAndroid Build Coastguard Worker
6819*da0073e9SAndroid Build Coastguard Worker /* These requests allow control to move from the simulated CPU to the
6820*da0073e9SAndroid Build Coastguard Worker real CPU, calling an arbitrary function.
6821*da0073e9SAndroid Build Coastguard Worker
6822*da0073e9SAndroid Build Coastguard Worker Note that the current ThreadId is inserted as the first argument.
6823*da0073e9SAndroid Build Coastguard Worker So this call:
6824*da0073e9SAndroid Build Coastguard Worker
6825*da0073e9SAndroid Build Coastguard Worker VALGRIND_NON_SIMD_CALL2(f, arg1, arg2)
6826*da0073e9SAndroid Build Coastguard Worker
6827*da0073e9SAndroid Build Coastguard Worker requires f to have this signature:
6828*da0073e9SAndroid Build Coastguard Worker
6829*da0073e9SAndroid Build Coastguard Worker Word f(Word tid, Word arg1, Word arg2)
6830*da0073e9SAndroid Build Coastguard Worker
6831*da0073e9SAndroid Build Coastguard Worker where "Word" is a word-sized type.
6832*da0073e9SAndroid Build Coastguard Worker
6833*da0073e9SAndroid Build Coastguard Worker Note that these client requests are not entirely reliable. For example,
6834*da0073e9SAndroid Build Coastguard Worker if you call a function with them that subsequently calls printf(),
6835*da0073e9SAndroid Build Coastguard Worker there's a high chance Valgrind will crash. Generally, your prospects of
6836*da0073e9SAndroid Build Coastguard Worker these working are made higher if the called function does not refer to
6837*da0073e9SAndroid Build Coastguard Worker any global variables, and does not refer to any libc or other functions
6838*da0073e9SAndroid Build Coastguard Worker (printf et al). Any kind of entanglement with libc or dynamic linking is
6839*da0073e9SAndroid Build Coastguard Worker likely to have a bad outcome, for tricky reasons which we've grappled
6840*da0073e9SAndroid Build Coastguard Worker with a lot in the past.
6841*da0073e9SAndroid Build Coastguard Worker */
6842*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
6843*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
6844*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CLIENT_CALL0, \
6845*da0073e9SAndroid Build Coastguard Worker _qyy_fn, \
6846*da0073e9SAndroid Build Coastguard Worker 0, 0, 0, 0)
6847*da0073e9SAndroid Build Coastguard Worker
6848*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
6849*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
6850*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CLIENT_CALL1, \
6851*da0073e9SAndroid Build Coastguard Worker _qyy_fn, \
6852*da0073e9SAndroid Build Coastguard Worker _qyy_arg1, 0, 0, 0)
6853*da0073e9SAndroid Build Coastguard Worker
6854*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
6855*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
6856*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CLIENT_CALL2, \
6857*da0073e9SAndroid Build Coastguard Worker _qyy_fn, \
6858*da0073e9SAndroid Build Coastguard Worker _qyy_arg1, _qyy_arg2, 0, 0)
6859*da0073e9SAndroid Build Coastguard Worker
6860*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
6861*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
6862*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__CLIENT_CALL3, \
6863*da0073e9SAndroid Build Coastguard Worker _qyy_fn, \
6864*da0073e9SAndroid Build Coastguard Worker _qyy_arg1, _qyy_arg2, \
6865*da0073e9SAndroid Build Coastguard Worker _qyy_arg3, 0)
6866*da0073e9SAndroid Build Coastguard Worker
6867*da0073e9SAndroid Build Coastguard Worker
6868*da0073e9SAndroid Build Coastguard Worker /* Counts the number of errors that have been recorded by a tool. Nb:
6869*da0073e9SAndroid Build Coastguard Worker the tool must record the errors with VG_(maybe_record_error)() or
6870*da0073e9SAndroid Build Coastguard Worker VG_(unique_error)() for them to be counted. */
6871*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_COUNT_ERRORS \
6872*da0073e9SAndroid Build Coastguard Worker (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR( \
6873*da0073e9SAndroid Build Coastguard Worker 0 /* default return */, \
6874*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__COUNT_ERRORS, \
6875*da0073e9SAndroid Build Coastguard Worker 0, 0, 0, 0, 0)
6876*da0073e9SAndroid Build Coastguard Worker
6877*da0073e9SAndroid Build Coastguard Worker /* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing
6878*da0073e9SAndroid Build Coastguard Worker when heap blocks are allocated in order to give accurate results. This
6879*da0073e9SAndroid Build Coastguard Worker happens automatically for the standard allocator functions such as
6880*da0073e9SAndroid Build Coastguard Worker malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete,
6881*da0073e9SAndroid Build Coastguard Worker delete[], etc.
6882*da0073e9SAndroid Build Coastguard Worker
6883*da0073e9SAndroid Build Coastguard Worker But if your program uses a custom allocator, this doesn't automatically
6884*da0073e9SAndroid Build Coastguard Worker happen, and Valgrind will not do as well. For example, if you allocate
6885*da0073e9SAndroid Build Coastguard Worker superblocks with mmap() and then allocates chunks of the superblocks, all
6886*da0073e9SAndroid Build Coastguard Worker Valgrind's observations will be at the mmap() level and it won't know that
6887*da0073e9SAndroid Build Coastguard Worker the chunks should be considered separate entities. In Memcheck's case,
6888*da0073e9SAndroid Build Coastguard Worker that means you probably won't get heap block overrun detection (because
6889*da0073e9SAndroid Build Coastguard Worker there won't be redzones marked as unaddressable) and you definitely won't
6890*da0073e9SAndroid Build Coastguard Worker get any leak detection.
6891*da0073e9SAndroid Build Coastguard Worker
6892*da0073e9SAndroid Build Coastguard Worker The following client requests allow a custom allocator to be annotated so
6893*da0073e9SAndroid Build Coastguard Worker that it can be handled accurately by Valgrind.
6894*da0073e9SAndroid Build Coastguard Worker
6895*da0073e9SAndroid Build Coastguard Worker VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated
6896*da0073e9SAndroid Build Coastguard Worker by a malloc()-like function. For Memcheck (an illustrative case), this
6897*da0073e9SAndroid Build Coastguard Worker does two things:
6898*da0073e9SAndroid Build Coastguard Worker
6899*da0073e9SAndroid Build Coastguard Worker - It records that the block has been allocated. This means any addresses
6900*da0073e9SAndroid Build Coastguard Worker within the block mentioned in error messages will be
6901*da0073e9SAndroid Build Coastguard Worker identified as belonging to the block. It also means that if the block
6902*da0073e9SAndroid Build Coastguard Worker isn't freed it will be detected by the leak checker.
6903*da0073e9SAndroid Build Coastguard Worker
6904*da0073e9SAndroid Build Coastguard Worker - It marks the block as being addressable and undefined (if 'is_zeroed' is
6905*da0073e9SAndroid Build Coastguard Worker not set), or addressable and defined (if 'is_zeroed' is set). This
6906*da0073e9SAndroid Build Coastguard Worker controls how accesses to the block by the program are handled.
6907*da0073e9SAndroid Build Coastguard Worker
6908*da0073e9SAndroid Build Coastguard Worker 'addr' is the start of the usable block (ie. after any
6909*da0073e9SAndroid Build Coastguard Worker redzone), 'sizeB' is its size. 'rzB' is the redzone size if the allocator
6910*da0073e9SAndroid Build Coastguard Worker can apply redzones -- these are blocks of padding at the start and end of
6911*da0073e9SAndroid Build Coastguard Worker each block. Adding redzones is recommended as it makes it much more likely
6912*da0073e9SAndroid Build Coastguard Worker Valgrind will spot block overruns. `is_zeroed' indicates if the memory is
6913*da0073e9SAndroid Build Coastguard Worker zeroed (or filled with another predictable value), as is the case for
6914*da0073e9SAndroid Build Coastguard Worker calloc().
6915*da0073e9SAndroid Build Coastguard Worker
6916*da0073e9SAndroid Build Coastguard Worker VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a
6917*da0073e9SAndroid Build Coastguard Worker heap block -- that will be used by the client program -- is allocated.
6918*da0073e9SAndroid Build Coastguard Worker It's best to put it at the outermost level of the allocator if possible;
6919*da0073e9SAndroid Build Coastguard Worker for example, if you have a function my_alloc() which calls
6920*da0073e9SAndroid Build Coastguard Worker internal_alloc(), and the client request is put inside internal_alloc(),
6921*da0073e9SAndroid Build Coastguard Worker stack traces relating to the heap block will contain entries for both
6922*da0073e9SAndroid Build Coastguard Worker my_alloc() and internal_alloc(), which is probably not what you want.
6923*da0073e9SAndroid Build Coastguard Worker
6924*da0073e9SAndroid Build Coastguard Worker For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out
6925*da0073e9SAndroid Build Coastguard Worker custom blocks from within a heap block, B, that has been allocated with
6926*da0073e9SAndroid Build Coastguard Worker malloc/calloc/new/etc, then block B will be *ignored* during leak-checking
6927*da0073e9SAndroid Build Coastguard Worker -- the custom blocks will take precedence.
6928*da0073e9SAndroid Build Coastguard Worker
6929*da0073e9SAndroid Build Coastguard Worker VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK. For
6930*da0073e9SAndroid Build Coastguard Worker Memcheck, it does two things:
6931*da0073e9SAndroid Build Coastguard Worker
6932*da0073e9SAndroid Build Coastguard Worker - It records that the block has been deallocated. This assumes that the
6933*da0073e9SAndroid Build Coastguard Worker block was annotated as having been allocated via
6934*da0073e9SAndroid Build Coastguard Worker VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued.
6935*da0073e9SAndroid Build Coastguard Worker
6936*da0073e9SAndroid Build Coastguard Worker - It marks the block as being unaddressable.
6937*da0073e9SAndroid Build Coastguard Worker
6938*da0073e9SAndroid Build Coastguard Worker VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a
6939*da0073e9SAndroid Build Coastguard Worker heap block is deallocated.
6940*da0073e9SAndroid Build Coastguard Worker
6941*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESIZEINPLACE_BLOCK informs a tool about reallocation. For
6942*da0073e9SAndroid Build Coastguard Worker Memcheck, it does four things:
6943*da0073e9SAndroid Build Coastguard Worker
6944*da0073e9SAndroid Build Coastguard Worker - It records that the size of a block has been changed. This assumes that
6945*da0073e9SAndroid Build Coastguard Worker the block was annotated as having been allocated via
6946*da0073e9SAndroid Build Coastguard Worker VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued.
6947*da0073e9SAndroid Build Coastguard Worker
6948*da0073e9SAndroid Build Coastguard Worker - If the block shrunk, it marks the freed memory as being unaddressable.
6949*da0073e9SAndroid Build Coastguard Worker
6950*da0073e9SAndroid Build Coastguard Worker - If the block grew, it marks the new area as undefined and defines a red
6951*da0073e9SAndroid Build Coastguard Worker zone past the end of the new block.
6952*da0073e9SAndroid Build Coastguard Worker
6953*da0073e9SAndroid Build Coastguard Worker - The V-bits of the overlap between the old and the new block are preserved.
6954*da0073e9SAndroid Build Coastguard Worker
6955*da0073e9SAndroid Build Coastguard Worker VALGRIND_RESIZEINPLACE_BLOCK should be put after allocation of the new block
6956*da0073e9SAndroid Build Coastguard Worker and before deallocation of the old block.
6957*da0073e9SAndroid Build Coastguard Worker
6958*da0073e9SAndroid Build Coastguard Worker In many cases, these three client requests will not be enough to get your
6959*da0073e9SAndroid Build Coastguard Worker allocator working well with Memcheck. More specifically, if your allocator
6960*da0073e9SAndroid Build Coastguard Worker writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call
6961*da0073e9SAndroid Build Coastguard Worker will be necessary to mark the memory as addressable just before the zeroing
6962*da0073e9SAndroid Build Coastguard Worker occurs, otherwise you'll get a lot of invalid write errors. For example,
6963*da0073e9SAndroid Build Coastguard Worker you'll need to do this if your allocator recycles freed blocks, but it
6964*da0073e9SAndroid Build Coastguard Worker zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK).
6965*da0073e9SAndroid Build Coastguard Worker Alternatively, if your allocator reuses freed blocks for allocator-internal
6966*da0073e9SAndroid Build Coastguard Worker data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary.
6967*da0073e9SAndroid Build Coastguard Worker
6968*da0073e9SAndroid Build Coastguard Worker Really, what's happening is a blurring of the lines between the client
6969*da0073e9SAndroid Build Coastguard Worker program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the
6970*da0073e9SAndroid Build Coastguard Worker memory should be considered unaddressable to the client program, but the
6971*da0073e9SAndroid Build Coastguard Worker allocator knows more than the rest of the client program and so may be able
6972*da0073e9SAndroid Build Coastguard Worker to safely access it. Extra client requests are necessary for Valgrind to
6973*da0073e9SAndroid Build Coastguard Worker understand the distinction between the allocator and the rest of the
6974*da0073e9SAndroid Build Coastguard Worker program.
6975*da0073e9SAndroid Build Coastguard Worker
6976*da0073e9SAndroid Build Coastguard Worker Ignored if addr == 0.
6977*da0073e9SAndroid Build Coastguard Worker */
6978*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
6979*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK, \
6980*da0073e9SAndroid Build Coastguard Worker addr, sizeB, rzB, is_zeroed, 0)
6981*da0073e9SAndroid Build Coastguard Worker
6982*da0073e9SAndroid Build Coastguard Worker /* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
6983*da0073e9SAndroid Build Coastguard Worker Ignored if addr == 0.
6984*da0073e9SAndroid Build Coastguard Worker */
6985*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) \
6986*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK, \
6987*da0073e9SAndroid Build Coastguard Worker addr, oldSizeB, newSizeB, rzB, 0)
6988*da0073e9SAndroid Build Coastguard Worker
6989*da0073e9SAndroid Build Coastguard Worker /* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
6990*da0073e9SAndroid Build Coastguard Worker Ignored if addr == 0.
6991*da0073e9SAndroid Build Coastguard Worker */
6992*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
6993*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK, \
6994*da0073e9SAndroid Build Coastguard Worker addr, rzB, 0, 0, 0)
6995*da0073e9SAndroid Build Coastguard Worker
6996*da0073e9SAndroid Build Coastguard Worker /* Create a memory pool. */
6997*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
6998*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \
6999*da0073e9SAndroid Build Coastguard Worker pool, rzB, is_zeroed, 0, 0)
7000*da0073e9SAndroid Build Coastguard Worker
7001*da0073e9SAndroid Build Coastguard Worker /* Create a memory pool with some flags specifying extended behaviour.
7002*da0073e9SAndroid Build Coastguard Worker When flags is zero, the behaviour is identical to VALGRIND_CREATE_MEMPOOL.
7003*da0073e9SAndroid Build Coastguard Worker
7004*da0073e9SAndroid Build Coastguard Worker The flag VALGRIND_MEMPOOL_METAPOOL specifies that the pieces of memory
7005*da0073e9SAndroid Build Coastguard Worker associated with the pool using VALGRIND_MEMPOOL_ALLOC will be used
7006*da0073e9SAndroid Build Coastguard Worker by the application as superblocks to dole out MALLOC_LIKE blocks using
7007*da0073e9SAndroid Build Coastguard Worker VALGRIND_MALLOCLIKE_BLOCK. In other words, a meta pool is a "2 levels"
7008*da0073e9SAndroid Build Coastguard Worker pool : first level is the blocks described by VALGRIND_MEMPOOL_ALLOC.
7009*da0073e9SAndroid Build Coastguard Worker The second level blocks are described using VALGRIND_MALLOCLIKE_BLOCK.
7010*da0073e9SAndroid Build Coastguard Worker Note that the association between the pool and the second level blocks
7011*da0073e9SAndroid Build Coastguard Worker is implicit : second level blocks will be located inside first level
7012*da0073e9SAndroid Build Coastguard Worker blocks. It is necessary to use the VALGRIND_MEMPOOL_METAPOOL flag
7013*da0073e9SAndroid Build Coastguard Worker for such 2 levels pools, as otherwise valgrind will detect overlapping
7014*da0073e9SAndroid Build Coastguard Worker memory blocks, and will abort execution (e.g. during leak search).
7015*da0073e9SAndroid Build Coastguard Worker
7016*da0073e9SAndroid Build Coastguard Worker Such a meta pool can also be marked as an 'auto free' pool using the flag
7017*da0073e9SAndroid Build Coastguard Worker VALGRIND_MEMPOOL_AUTO_FREE, which must be OR-ed together with the
7018*da0073e9SAndroid Build Coastguard Worker VALGRIND_MEMPOOL_METAPOOL. For an 'auto free' pool, VALGRIND_MEMPOOL_FREE
7019*da0073e9SAndroid Build Coastguard Worker will automatically free the second level blocks that are contained
7020*da0073e9SAndroid Build Coastguard Worker inside the first level block freed with VALGRIND_MEMPOOL_FREE.
7021*da0073e9SAndroid Build Coastguard Worker In other words, calling VALGRIND_MEMPOOL_FREE will cause implicit calls
7022*da0073e9SAndroid Build Coastguard Worker to VALGRIND_FREELIKE_BLOCK for all the second level blocks included
7023*da0073e9SAndroid Build Coastguard Worker in the first level block.
7024*da0073e9SAndroid Build Coastguard Worker Note: it is an error to use the VALGRIND_MEMPOOL_AUTO_FREE flag
7025*da0073e9SAndroid Build Coastguard Worker without the VALGRIND_MEMPOOL_METAPOOL flag.
7026*da0073e9SAndroid Build Coastguard Worker */
7027*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_AUTO_FREE 1
7028*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_METAPOOL 2
7029*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CREATE_MEMPOOL_EXT(pool, rzB, is_zeroed, flags) \
7030*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \
7031*da0073e9SAndroid Build Coastguard Worker pool, rzB, is_zeroed, flags, 0)
7032*da0073e9SAndroid Build Coastguard Worker
7033*da0073e9SAndroid Build Coastguard Worker /* Destroy a memory pool. */
7034*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DESTROY_MEMPOOL(pool) \
7035*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL, \
7036*da0073e9SAndroid Build Coastguard Worker pool, 0, 0, 0, 0)
7037*da0073e9SAndroid Build Coastguard Worker
7038*da0073e9SAndroid Build Coastguard Worker /* Associate a piece of memory with a memory pool. */
7039*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
7040*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC, \
7041*da0073e9SAndroid Build Coastguard Worker pool, addr, size, 0, 0)
7042*da0073e9SAndroid Build Coastguard Worker
7043*da0073e9SAndroid Build Coastguard Worker /* Disassociate a piece of memory from a memory pool. */
7044*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_FREE(pool, addr) \
7045*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE, \
7046*da0073e9SAndroid Build Coastguard Worker pool, addr, 0, 0, 0)
7047*da0073e9SAndroid Build Coastguard Worker
7048*da0073e9SAndroid Build Coastguard Worker /* Disassociate any pieces outside a particular range. */
7049*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \
7050*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM, \
7051*da0073e9SAndroid Build Coastguard Worker pool, addr, size, 0, 0)
7052*da0073e9SAndroid Build Coastguard Worker
7053*da0073e9SAndroid Build Coastguard Worker /* Resize and/or move a piece associated with a memory pool. */
7054*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \
7055*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL, \
7056*da0073e9SAndroid Build Coastguard Worker poolA, poolB, 0, 0, 0)
7057*da0073e9SAndroid Build Coastguard Worker
7058*da0073e9SAndroid Build Coastguard Worker /* Resize and/or move a piece associated with a memory pool. */
7059*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \
7060*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE, \
7061*da0073e9SAndroid Build Coastguard Worker pool, addrA, addrB, size, 0)
7062*da0073e9SAndroid Build Coastguard Worker
7063*da0073e9SAndroid Build Coastguard Worker /* Return 1 if a mempool exists, else 0. */
7064*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MEMPOOL_EXISTS(pool) \
7065*da0073e9SAndroid Build Coastguard Worker (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
7066*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MEMPOOL_EXISTS, \
7067*da0073e9SAndroid Build Coastguard Worker pool, 0, 0, 0, 0)
7068*da0073e9SAndroid Build Coastguard Worker
7069*da0073e9SAndroid Build Coastguard Worker /* Mark a piece of memory as being a stack. Returns a stack id.
7070*da0073e9SAndroid Build Coastguard Worker start is the lowest addressable stack byte, end is the highest
7071*da0073e9SAndroid Build Coastguard Worker addressable stack byte. */
7072*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_STACK_REGISTER(start, end) \
7073*da0073e9SAndroid Build Coastguard Worker (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
7074*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__STACK_REGISTER, \
7075*da0073e9SAndroid Build Coastguard Worker start, end, 0, 0, 0)
7076*da0073e9SAndroid Build Coastguard Worker
7077*da0073e9SAndroid Build Coastguard Worker /* Unmark the piece of memory associated with a stack id as being a
7078*da0073e9SAndroid Build Coastguard Worker stack. */
7079*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_STACK_DEREGISTER(id) \
7080*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \
7081*da0073e9SAndroid Build Coastguard Worker id, 0, 0, 0, 0)
7082*da0073e9SAndroid Build Coastguard Worker
7083*da0073e9SAndroid Build Coastguard Worker /* Change the start and end address of the stack id.
7084*da0073e9SAndroid Build Coastguard Worker start is the new lowest addressable stack byte, end is the new highest
7085*da0073e9SAndroid Build Coastguard Worker addressable stack byte. */
7086*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_STACK_CHANGE(id, start, end) \
7087*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \
7088*da0073e9SAndroid Build Coastguard Worker id, start, end, 0, 0)
7089*da0073e9SAndroid Build Coastguard Worker
7090*da0073e9SAndroid Build Coastguard Worker /* Load PDB debug info for Wine PE image_map. */
7091*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \
7092*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \
7093*da0073e9SAndroid Build Coastguard Worker fd, ptr, total_size, delta, 0)
7094*da0073e9SAndroid Build Coastguard Worker
7095*da0073e9SAndroid Build Coastguard Worker /* Map a code address to a source file name and line number. buf64
7096*da0073e9SAndroid Build Coastguard Worker must point to a 64-byte buffer in the caller's address space. The
7097*da0073e9SAndroid Build Coastguard Worker result will be dumped in there and is guaranteed to be zero
7098*da0073e9SAndroid Build Coastguard Worker terminated. If no info is found, the first byte is set to zero. */
7099*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \
7100*da0073e9SAndroid Build Coastguard Worker (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
7101*da0073e9SAndroid Build Coastguard Worker VG_USERREQ__MAP_IP_TO_SRCLOC, \
7102*da0073e9SAndroid Build Coastguard Worker addr, buf64, 0, 0, 0)
7103*da0073e9SAndroid Build Coastguard Worker
7104*da0073e9SAndroid Build Coastguard Worker /* Disable error reporting for this thread. Behaves in a stack like
7105*da0073e9SAndroid Build Coastguard Worker way, so you can safely call this multiple times provided that
7106*da0073e9SAndroid Build Coastguard Worker VALGRIND_ENABLE_ERROR_REPORTING is called the same number of times
7107*da0073e9SAndroid Build Coastguard Worker to re-enable reporting. The first call of this macro disables
7108*da0073e9SAndroid Build Coastguard Worker reporting. Subsequent calls have no effect except to increase the
7109*da0073e9SAndroid Build Coastguard Worker number of VALGRIND_ENABLE_ERROR_REPORTING calls needed to re-enable
7110*da0073e9SAndroid Build Coastguard Worker reporting. Child threads do not inherit this setting from their
7111*da0073e9SAndroid Build Coastguard Worker parents -- they are always created with reporting enabled. */
7112*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_DISABLE_ERROR_REPORTING \
7113*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
7114*da0073e9SAndroid Build Coastguard Worker 1, 0, 0, 0, 0)
7115*da0073e9SAndroid Build Coastguard Worker
7116*da0073e9SAndroid Build Coastguard Worker /* Re-enable error reporting, as per comments on
7117*da0073e9SAndroid Build Coastguard Worker VALGRIND_DISABLE_ERROR_REPORTING. */
7118*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_ENABLE_ERROR_REPORTING \
7119*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
7120*da0073e9SAndroid Build Coastguard Worker -1, 0, 0, 0, 0)
7121*da0073e9SAndroid Build Coastguard Worker
7122*da0073e9SAndroid Build Coastguard Worker /* Execute a monitor command from the client program.
7123*da0073e9SAndroid Build Coastguard Worker If a connection is opened with GDB, the output will be sent
7124*da0073e9SAndroid Build Coastguard Worker according to the output mode set for vgdb.
7125*da0073e9SAndroid Build Coastguard Worker If no connection is opened, output will go to the log output.
7126*da0073e9SAndroid Build Coastguard Worker Returns 1 if command not recognised, 0 otherwise. */
7127*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_MONITOR_COMMAND(command) \
7128*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \
7129*da0073e9SAndroid Build Coastguard Worker command, 0, 0, 0, 0)
7130*da0073e9SAndroid Build Coastguard Worker
7131*da0073e9SAndroid Build Coastguard Worker
7132*da0073e9SAndroid Build Coastguard Worker /* Change the value of a dynamic command line option.
7133*da0073e9SAndroid Build Coastguard Worker Note that unknown or not dynamically changeable options
7134*da0073e9SAndroid Build Coastguard Worker will cause a warning message to be output. */
7135*da0073e9SAndroid Build Coastguard Worker #define VALGRIND_CLO_CHANGE(option) \
7136*da0073e9SAndroid Build Coastguard Worker VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CLO_CHANGE, \
7137*da0073e9SAndroid Build Coastguard Worker option, 0, 0, 0, 0)
7138*da0073e9SAndroid Build Coastguard Worker
7139*da0073e9SAndroid Build Coastguard Worker
7140*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_darwin
7141*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_darwin
7142*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_win32
7143*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_win64
7144*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_linux
7145*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_linux
7146*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc32_linux
7147*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc64be_linux
7148*da0073e9SAndroid Build Coastguard Worker #undef PLAT_ppc64le_linux
7149*da0073e9SAndroid Build Coastguard Worker #undef PLAT_arm_linux
7150*da0073e9SAndroid Build Coastguard Worker #undef PLAT_s390x_linux
7151*da0073e9SAndroid Build Coastguard Worker #undef PLAT_mips32_linux
7152*da0073e9SAndroid Build Coastguard Worker #undef PLAT_mips64_linux
7153*da0073e9SAndroid Build Coastguard Worker #undef PLAT_nanomips_linux
7154*da0073e9SAndroid Build Coastguard Worker #undef PLAT_x86_solaris
7155*da0073e9SAndroid Build Coastguard Worker #undef PLAT_amd64_solaris
7156*da0073e9SAndroid Build Coastguard Worker
7157*da0073e9SAndroid Build Coastguard Worker #endif /* __VALGRIND_H */
7158